Disclaimer: The purpose of the Open Case Studies project is to demonstrate the use of various data science methods, tools, and software in the context of messy, real-world data. A given case study does not cover all aspects of the research process, is not claiming to be the most appropriate way to analyze a given data set, and should not be used in the context of making policy decisions without external consultation from scientific experts.

Motivation


This case study explores how different countries have contributed to Carbon Dioxide (CO2) emissions over time and how CO2 emission rates may relate to increasing global temperatures and increased rates of natural disasters and storms. This report provides a basis for the motivation: https://www.epa.gov/report-environment/greenhouse-gases.

CO2 makes up the largest proportion of greenhouse gas emissions in the United States:

A variety of sources and sectors contribute to greenhouse gas emissions, with transportation contributing the most metric tons of CO2:

So why should we pay attention to greenhouse gases?

According to the US Environmental Protection Agency (EPA) Inventory of U.S. Greenhouse Gas Emissions and Sinks 2020 Report:

Greenhouse gases absorb infrared radiation, thereby trapping heat in the atmosphere and making the planet warmer. The most important greenhouse gases directly emitted by humans include carbon dioxide (CO2), methane (CH4), nitrous oxide (N2O), and several fluorine-containing halogenated substances. Although CO2, CH4, and N2O occur naturally in the atmosphere, human activities have changed their atmospheric concentrations. From the pre- industrial era (i.e., ending about 1750) to 2018, concentrations of these greenhouse gases have increased globally by 46, 165, and 23 percent, respectively (IPCC 2013; NOAA/ESRL 2019a, 2019b, 2019c).

  • IPCC stands for the Intergovernmental Panel on Climate Change

There are many signs that our planet is experiencing warmer temperatures:

The connection between greenhouse gas levels and global temperatures and the influence of increased global temperatures on human health are motivated by these reports:

Melillo, J.M., T.C. Richmond, and G.W. Yohe (eds.). 2014. Climate change impacts in the United States: The third National Climate Assessment. U.S. Global Change Research Program.

  1. “Inventory of US Greenhouse Gas Emissions and Sinks: 1990–2018.” EPA 430-R-20-002, Tech. Rep. https://www.epa.gov/ghgemissions/inventory-us-greenhouse-gas-emissions-and-sinks.

The National Climate Assessment Report states that:

Heat-trapping gases already in the atmosphere have committed us to a hotter future with more climate-related impacts over the next few decades. The magnitude of climate change beyond the next few decades depends primarily on the amount of heat-trapping gases that human activities emit globally, now and in the future.

See here and here for more information.

Main Questions


Our main question:

  1. How have global CO2 emission rates changed over time? In particular for the US, and how does the US compare to other countries?
  2. Are US CO2 emissions, global temperatures, and US storm rates associated?

Learning Objectives


In this case study, we will explore CO2 emission data from around the world. We will also focus on the US specifically to evaluate patterns of temperatures and storm activity. This case study will particularly focus on how to use different datasets that span different ranges of time, as well as how to create visualizations of patterns over time. We will especially focus on using packages and functions from the Tidyverse, such as dplyr, tidyr, ggplot2and gganimate. The tidyverse is a library of packages created by RStudio. While some students may be familiar with previous R programming packages, these packages make data science in R especially efficient.


We will begin by loading the packages that we will need:

Package Use
here to easily load and save data
readxl to import the excel file data
readr to import the csv file data
dplyr to view and wrangle the data
magrittr to use and reassign data objects using the %<>%pipe operator
tidyverse to wrangle the data and create ggplot2 plots
####plotyly to make the visualizations
ggplot2 to make visualizations
directlabels to add labels to plots easily
ggrepel to add labels that don’t overlap to plots
gganimate to make the plots interactive
RColorBrewer to have greater control over the color in our plots
patchwork to combine plots

The first time we use a function, we will use the :: to indicate which package we are using. Unless we have overlapping function names, this is not necessary, but we will include it here to be informative about where the functions we will use come from.

Context


Greenhouse gas emissions are due to both natural processes and anthropogenic (human-derived) activities.

These emissions are one of the contributing factors to rising global temperatures, which can have a great influence on public health as illustrated in the following image:

Gases in the atmosphere can contribute to climate change both directly and indirectly. Direct effects occur when the gas itself absorbs radiation. Indirect radiative forcing occurs when chemical transformations of the substance produce other greenhouse gases, when a gas influences the atmospheric lifetimes of other gases, and/or when a gas affects atmospheric processes that alter the radiative balance of the earth (e.g., affect cloud formation or albedo). The IPCC developed the Global Warming Potential (GWP) concept to compare the ability of a greenhouse gas to trap heat in the atmosphere relative to another gas. The GWP of a greenhouse gas is defined as the ratio of the accumulated radiative forcing within a specific time horizon caused by emitting 1 kilogram of the gas, relative to that of the reference gas CO2 (IPCC 2013). Therefore GWP-weighted emissions are provided in million metric tons of CO2 equivalent (MMT CO2 Eq.)

CO2 is actually the least capable of the greenhouse gases for trapping heat:

However, because CO2 is so much more abundant and stays in the atmosphere so much longer than other greenhouse gases, it has been the largest contributor to global warming.

See here for more details.

Furthermore, sizing CO2 levels also influence ocean acidity:

This makes it difficult for organisms to maintain their shells or skeletons that are made of calcium carbonate, thus making it more difficult for these organisms to survive and impacting their role in the ecosystem and food chain.

Furthermore, greenhouse gas emissions are believed to influence storm rates.

Indeed events with high levels of precipitation which can induce flooding and property damage are generally increasing around the country:

Limitations


There are some important considerations regarding this data analysis to keep in mind:

  1. The datasets included only include countries and years in which countries were reporting such information to the agencies that collected the data. Thus the data is incomplete. For example while we have a fairly good sense of CO2 emissions globally for later years, additional emissions were also produced by countries that are not included in the data.

  2. Correlation or association does not imply causation. We will be showing how different datasets show similar trends across time. This does not imply that one caused the other. However, in the case of some of the data we will show, there is additional scientific evidence to suggest that for example, increased CO2 emissions may cause increased temperatures or increased rates of disastors. However, simply showing a similar trend over time does not in itself prove that two variables are causally related. As you can see from this plot, often data may show a similar pattern over time by random chance. See this website for more examples.

What are the data?


In this case study we will be using data related to CO2 emissions, as well as other data that may influence, be influenced or relate to CO2 emissions. Most of our data was obtained from Gapminder, which is a unique nonprofit that provides a variety of data for free.

In their words, Gapminder is…

Gapminder is an independent Swedish foundation with no political, religious or economic affiliations. Gapminder is a fact tank, not a think tank. Gapminder fights devastating misconceptions about global development. Gapminder produces free teaching resources making the world understandable based on reliable statistics. Gapminder promotes a fact-based worldview everyone can understand. Gapminder collaborates with universities, UN, public agencies and non-governmental organizations. All Gapminder activities are governed by the board. We do not award grants. Gapminder Foundation is registered at Stockholm County Administration Board. Our constitution can be found here.

The data that we will be using from Gapminder was obtained from the World Bank.

In addition we will use some data that is specific to the United States from the [National Oceanic and Atmospheric Administration (NOAA)] (https://www.noaa.gov/), which is an agency that collects weather and climate data.

Data Time span Source Orginal Source Description Citation
CO2 emissions 1751 to 2014 Gapminder Carbon Dioxid Information Analysis Center (CDIAC) CO2 emissions in tonnes or metric tons (equivalent to approximately 2,204.6 pounds) per person by country NA
GDP per capita, percent yearly growth 1801 to 2019 Gapminder World Bank Growth Domestic Product (which is an overall measure of the health of nation’s economy) per person by country NA
Energy use per person 1960 to 2015 Gapminder World Bank Use of primary energy before transformation to other end-use fules, by country NA
Crude Mortality Rate 1960 to 2018 World Bank World Bank Death rate per 1,000 people by country NA
US Natural Disasters 1980 to 2019 The National Oceanic and Atmospheric Administration (NOAA) The National Oceanic and Atmospheric Administration (NOAA) US data about:
– Droughts
– Floods
– Freezes
– Severe Storms
– Tropical Cyclones
– Wildfires
– Winter Storms
NOAA National Centers for Environmental Information (NCEI) U.S. Billion-Dollar Weather and Climate Disasters (2020). https://www.ncdc.noaa.gov/billions/, DOI: 10.25921/stkw-7w73
Temperature 1895 to 2019 The National Oceanic and Atmospheric Administration (NOAA) The National Oceanic and Atmospheric Administration (NOAA) US National yearly average temperature (in Fahrenheit) from 1895 to 2019 NOAA National Centers for Environmental information, Climate at a Glance: National Time Series, published June 2020, retrieved on June 26, 2020 from https://www.ncdc.noaa.gov/cag/

To obtain the temperature data, annual average temperatures were selected as shown in this image:

Importantly, notice that the data we would like to use span different time periods:

Data Time span
CO2 emissions 1751 to 2014
GDP per capita, yearly growth 1801 to 2019
Energy use per person 1960 to 2015
Crude Mortality Rate 1960 to 2018
US Natural Disasters 1980 to 2019
Temperature 1895 to 2019

Data Import


To read in the files that were downloaded from the various sources as indicated in the table above, we will use the read_xlsx() and read_xls() functions of the readxl package to import the data from the .xlsx and .xls files respectively and we will use the read_csv function of the readr package to import the data from the csv files.

For our csv data files, there are some lines that we would like to not import - infact, we will get an error if we try to import them because our table structure will be as r expects. We can do so using the skip = argument of the read_csv() function.

Here you can see that the first two rows of the data about US Disasters doesn’t have the same number of columns as the subsequent rows. So we want to skip these first two lines, we will use skip = 2 for this.

Now looking at the temperature data, we can see that the first four lines do not have the same number of columns as the subsequent lines. We will skip importing all 4 lines by using skip = 4. We can also specify that NA values are encoded as "-99". This will replace all instances of "-99" with NA. We can do this using the na = argument of the read_csv() function. We will do so as: na = "-99". The “-99” needs to be in quotation markes becuase this argument expects characters.

Great! now we have imported all of the data that we will need.

Data Wrangling


Now we will take a look at our data and wrangle it until it is easy to use to allow us to evaluate how CO2 emissions have changed over time and how emissions may relate to energy use, mortality, GDP etc.

Yearly CO2 Emissions

First let’s take a look at the CO2 data. We can use the base slice_head() function of the dplyr package to see just the first rows of our data. We can specify how many rows we would like to see by using the n = argument. It is also useful to use the slice_sample() function to look at a selection of random rows.

We will use the %>% pipe which can be used to define the input for later sequential steps. This will make more sense when we have multiple sequential steps using the same data object. To use the pipe notation we need to install and load the dplyr package.

# A tibble: 6 x 265
  country `1751` `1752` `1753` `1754` `1755` `1756` `1757` `1758` `1759` `1760`
  <chr>    <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>
1 Afghan…     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA
2 Albania     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA
3 Algeria     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA
4 Andorra     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA
5 Angola      NA     NA     NA     NA     NA     NA     NA     NA     NA     NA
6 Antigu…     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA
# … with 254 more variables: `1761` <dbl>, `1762` <dbl>, `1763` <dbl>,
#   `1764` <dbl>, `1765` <dbl>, `1766` <dbl>, `1767` <dbl>, `1768` <dbl>,
#   `1769` <dbl>, `1770` <dbl>, `1771` <dbl>, `1772` <dbl>, `1773` <dbl>,
#   `1774` <dbl>, `1775` <dbl>, `1776` <dbl>, `1777` <dbl>, `1778` <dbl>,
#   `1779` <dbl>, `1780` <dbl>, `1781` <dbl>, `1782` <dbl>, `1783` <dbl>,
#   `1784` <dbl>, `1785` <dbl>, `1786` <dbl>, `1787` <dbl>, `1788` <dbl>,
#   `1789` <dbl>, `1790` <dbl>, `1791` <dbl>, `1792` <dbl>, `1793` <dbl>,
#   `1794` <dbl>, `1795` <dbl>, `1796` <dbl>, `1797` <dbl>, `1798` <dbl>,
#   `1799` <dbl>, `1800` <dbl>, `1801` <dbl>, `1802` <dbl>, `1803` <dbl>,
#   `1804` <dbl>, `1805` <dbl>, `1806` <dbl>, `1807` <dbl>, `1808` <dbl>,
#   `1809` <dbl>, `1810` <dbl>, `1811` <dbl>, `1812` <dbl>, `1813` <dbl>,
#   `1814` <dbl>, `1815` <dbl>, `1816` <dbl>, `1817` <dbl>, `1818` <dbl>,
#   `1819` <dbl>, `1820` <dbl>, `1821` <dbl>, `1822` <dbl>, `1823` <dbl>,
#   `1824` <dbl>, `1825` <dbl>, `1826` <dbl>, `1827` <dbl>, `1828` <dbl>,
#   `1829` <dbl>, `1830` <dbl>, `1831` <dbl>, `1832` <dbl>, `1833` <dbl>,
#   `1834` <dbl>, `1835` <dbl>, `1836` <dbl>, `1837` <dbl>, `1838` <dbl>,
#   `1839` <dbl>, `1840` <dbl>, `1841` <dbl>, `1842` <dbl>, `1843` <dbl>,
#   `1844` <dbl>, `1845` <dbl>, `1846` <dbl>, `1847` <dbl>, `1848` <dbl>,
#   `1849` <dbl>, `1850` <dbl>, `1851` <dbl>, `1852` <dbl>, `1853` <dbl>,
#   `1854` <dbl>, `1855` <dbl>, `1856` <dbl>, `1857` <dbl>, `1858` <dbl>,
#   `1859` <dbl>, `1860` <dbl>, …
# A tibble: 10 x 265
   country `1751` `1752` `1753` `1754` `1755` `1756` `1757` `1758` `1759` `1760`
   <chr>    <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>
 1 Thaila…     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA
 2 Cote d…     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA
 3 Sao To…     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA
 4 Grenada     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA
 5 Zimbab…     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA
 6 Mozamb…     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA
 7 Somalia     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA
 8 Libya       NA     NA     NA     NA     NA     NA     NA     NA     NA     NA
 9 Poland      NA     NA     NA     NA     NA     NA     NA     NA     NA     NA
10 Belgium     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA
# … with 254 more variables: `1761` <dbl>, `1762` <dbl>, `1763` <dbl>,
#   `1764` <dbl>, `1765` <dbl>, `1766` <dbl>, `1767` <dbl>, `1768` <dbl>,
#   `1769` <dbl>, `1770` <dbl>, `1771` <dbl>, `1772` <dbl>, `1773` <dbl>,
#   `1774` <dbl>, `1775` <dbl>, `1776` <dbl>, `1777` <dbl>, `1778` <dbl>,
#   `1779` <dbl>, `1780` <dbl>, `1781` <dbl>, `1782` <dbl>, `1783` <dbl>,
#   `1784` <dbl>, `1785` <dbl>, `1786` <dbl>, `1787` <dbl>, `1788` <dbl>,
#   `1789` <dbl>, `1790` <dbl>, `1791` <dbl>, `1792` <dbl>, `1793` <dbl>,
#   `1794` <dbl>, `1795` <dbl>, `1796` <dbl>, `1797` <dbl>, `1798` <dbl>,
#   `1799` <dbl>, `1800` <dbl>, `1801` <dbl>, `1802` <dbl>, `1803` <dbl>,
#   `1804` <dbl>, `1805` <dbl>, `1806` <dbl>, `1807` <dbl>, `1808` <dbl>,
#   `1809` <dbl>, `1810` <dbl>, `1811` <dbl>, `1812` <dbl>, `1813` <dbl>,
#   `1814` <dbl>, `1815` <dbl>, `1816` <dbl>, `1817` <dbl>, `1818` <dbl>,
#   `1819` <dbl>, `1820` <dbl>, `1821` <dbl>, `1822` <dbl>, `1823` <dbl>,
#   `1824` <dbl>, `1825` <dbl>, `1826` <dbl>, `1827` <dbl>, `1828` <dbl>,
#   `1829` <dbl>, `1830` <dbl>, `1831` <dbl>, `1832` <dbl>, `1833` <dbl>,
#   `1834` <dbl>, `1835` <dbl>, `1836` <dbl>, `1837` <dbl>, `1838` <dbl>,
#   `1839` <dbl>, `1840` <dbl>, `1841` <dbl>, `1842` <dbl>, `1843` <dbl>,
#   `1844` <dbl>, `1845` <dbl>, `1846` <dbl>, `1847` <dbl>, `1848` <dbl>,
#   `1849` <dbl>, `1850` <dbl>, `1851` <dbl>, `1852` <dbl>, `1853` <dbl>,
#   `1854` <dbl>, `1855` <dbl>, `1856` <dbl>, `1857` <dbl>, `1858` <dbl>,
#   `1859` <dbl>, `1860` <dbl>, …

OK, we can see that our country data makes of the rows and the yearly data makes up the columns. We also see that we have alot of NA values.

We can also use the glimpse() function of the dplyr packge to view our data. This allows us to see more of our data at once. We will see a tiny bit of each variable/column. To do so our data will be displayed with the column names listed on the right.

Rows: 192
Columns: 265
$ country <chr> "Afghanistan", "Albania", "Algeria", "Andorra", "Angola", "An…
$ `1751`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1752`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1753`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1754`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1755`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1756`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1757`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1758`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1759`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1760`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1761`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1762`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1763`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1764`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1765`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1766`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1767`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1768`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1769`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1770`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1771`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1772`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1773`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1774`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1775`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1776`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1777`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1778`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1779`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1780`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1781`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1782`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1783`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1784`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1785`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1786`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1787`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1788`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1789`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1790`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1791`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1792`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1793`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1794`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1795`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1796`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1797`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1798`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1799`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1800`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1801`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1802`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1803`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1804`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1805`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1806`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1807`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, 169, NA, NA, NA, NA, NA, …
$ `1808`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1809`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1810`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1811`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1812`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1813`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1814`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1815`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1816`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1817`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1818`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
$ `1819`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, 253, NA, NA, NA, NA, NA, …
$ `1820`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, 334, NA, NA, NA, NA, NA, …
$ `1821`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, 359, NA, NA, NA, NA, NA, …
$ `1822`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, 367, NA, NA, NA, NA, NA, …
$ `1823`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, 348, NA, NA, NA, NA, NA, …
$ `1824`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, 400, NA, NA, NA, NA, NA, …
$ `1825`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, 403, NA, NA, NA, NA, NA, …
$ `1826`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, 458, NA, NA, NA, NA, NA, …
$ `1827`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, 477, NA, NA, NA, NA, NA, …
$ `1828`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, 458, NA, NA, NA, NA, NA, …
$ `1829`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, 477, NA, NA, NA, NA, NA, …
$ `1830`  <dbl> NA, NA, NA, NA, NA, NA, NA, 0.032, NA, 495.000, 0.308, NA, NA…
$ `1831`  <dbl> NA, NA, NA, NA, NA, NA, NA, 3.84e-02, NA, 4.80e+02, 3.70e-01,…
$ `1832`  <dbl> NA, NA, NA, NA, NA, NA, NA, 2.56e-02, NA, 5.13e+02, 2.47e-01,…
$ `1833`  <dbl> NA, NA, NA, NA, NA, NA, NA, 0.032, NA, 429.000, 0.308, NA, NA…
$ `1834`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, 587, NA, NA, NA, NA, NA, …
$ `1835`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, 634, NA, NA, NA, NA, NA, …
$ `1836`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, 675, NA, NA, NA, NA, NA, …
$ `1837`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, 708, NA, NA, NA, NA, NA, …
$ `1838`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, 851, NA, NA, NA, NA, NA, …
$ `1839`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, 1060, NA, NA, NA, NA, NA,…
$ `1840`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, 1170, NA, NA, NA, NA, NA,…
$ `1841`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, 1320, NA, NA, NA, NA, NA,…
$ `1842`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, 1460, NA, NA, NA, NA, NA,…
$ `1843`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, 1270, NA, NA, NA, NA, NA,…
$ `1844`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, 1600, NA, NA, NA, NA, NA,…
$ `1845`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, 1800, NA, NA, NA, NA, NA,…
$ `1846`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, 2120, NA, NA, NA, NA, NA,…
$ `1847`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, 2080, NA, NA, NA, NA, NA,…
$ `1848`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, 2340, NA, NA, NA, NA, NA,…
$ `1849`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, 2260, NA, NA, NA, NA, NA,…
$ `1850`  <dbl> NA, NA, NA, NA, NA, NA, NA, 0.198, NA, 2330.000, 1.910, NA, N…
$ `1851`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, 2340, NA, NA, NA, NA, NA,…
$ `1852`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, 2810, NA, NA, NA, NA, NA,…
$ `1853`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, 3230, NA, NA, NA, NA, NA,…
$ `1854`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, 3180, NA, NA, NA, NA, NA,…
$ `1855`  <dbl> NA, NA, NA, NA, NA, NA, NA, 6.01e-01, NA, 3.70e+03, 5.80e+00,…
$ `1856`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, 4240, NA, NA, NA, NA, NA,…
$ `1857`  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, 4880, NA, NA, NA, NA, NA,…
$ `1858`  <dbl> NA, NA, NA, NA, NA, NA, NA, 8.44e-01, NA, 7.25e+03, 8.14e+00,…
$ `1859`  <dbl> NA, NA, NA, NA, NA, NA, NA, 8.95e-01, NA, 5.87e+03, 8.64e+00,…
$ `1860`  <dbl> NA, NA, NA, NA, NA, NA, NA, 1.18, 279.00, 6150.00, 11.40, NA,…
$ `1861`  <dbl> NA, NA, NA, NA, NA, NA, NA, 1.5, 510.0, 6380.0, 14.5, NA, NA,…
$ `1862`  <dbl> NA, NA, NA, NA, NA, NA, NA, 1.36, 356.00, 6360.00, 13.10, NA,…
$ `1863`  <dbl> NA, NA, NA, NA, NA, NA, NA, 1.42, 400.00, 5880.00, 13.70, NA,…
$ `1864`  <dbl> NA, NA, NA, NA, NA, NA, NA, 1.59, 268.00, 5080.00, 15.40, NA,…
$ `1865`  <dbl> NA, NA, NA, NA, NA, NA, NA, 1.52, 422.00, 5360.00, 14.70, NA,…
$ `1866`  <dbl> NA, NA, NA, NA, NA, NA, NA, 4.81, 697.00, 3600.00, 46.40, NA,…
$ `1867`  <dbl> NA, NA, NA, NA, NA, NA, NA, 5.52, 895.00, 4920.00, 53.20, NA,…
$ `1868`  <dbl> NA, NA, NA, NA, NA, NA, NA, 4.59, 733.00, 6080.00, 44.30, NA,…
$ `1869`  <dbl> NA, NA, NA, NA, NA, NA, NA, 6.23, 642.00, 6490.00, 60.10, NA,…
$ `1870`  <dbl> NA, NA, NA, NA, NA, NA, NA, 6.76, 601.00, 7370.00, 65.20, NA,…
$ `1871`  <dbl> NA, NA, NA, NA, NA, NA, NA, 9.12, 693.00, 10200.00, 88.00, NA…
$ `1872`  <dbl> NA, NA, NA, NA, NA, NA, NA, 9.36, 708.00, 10000.00, 90.40, NA…
$ `1873`  <dbl> NA, NA, NA, NA, NA, NA, NA, 8.79, 869.00, 10700.00, 84.80, NA…
$ `1874`  <dbl> NA, NA, NA, NA, NA, NA, NA, 10.7, 891.0, 9160.0, 103.0, NA, N…
$ `1875`  <dbl> NA, NA, NA, NA, NA, NA, NA, 12.3, 829.0, 7870.0, 119.0, NA, N…
$ `1876`  <dbl> NA, NA, NA, NA, NA, NA, NA, 15.2, 931.0, 8100.0, 147.0, NA, N…
$ `1877`  <dbl> NA, NA, NA, NA, NA, NA, NA, 15.6, 1070.0, 7290.0, 150.0, NA, …
$ `1878`  <dbl> NA, NA, NA, NA, NA, NA, NA, 20.3, 968.0, 7250.0, 196.0, NA, N…
$ `1879`  <dbl> NA, NA, NA, NA, NA, NA, NA, 20.9, 1460.0, 8870.0, 201.0, NA, …
$ `1880`  <dbl> NA, NA, NA, NA, NA, NA, NA, 24.5, 2210.0, 23700.0, 236.0, NA,…
$ `1881`  <dbl> NA, NA, NA, NA, NA, NA, NA, 25.80, 1770.00, 10300.00, 249.00,…
$ `1882`  <dbl> NA, NA, NA, NA, NA, NA, NA, 27.20, 2010.00, 10600.00, 262.00,…
$ `1883`  <dbl> NA, NA, NA, NA, NA, NA, NA, 30.90, 2430.00, 11800.00, 298.00,…
$ `1884`  <dbl> NA, NA, NA, NA, NA, NA, NA, 31.4, 2570.0, 11500.0, 303.0, NA,…
$ `1885`  <dbl> NA, NA, NA, NA, NA, NA, NA, 34.20, 2910.00, 12100.00, 330.00,…
$ `1886`  <dbl> NA, NA, NA, NA, NA, NA, NA, 35.10, 2890.00, 11400.00, 338.00,…
$ `1887`  <dbl> NA, NA, NA, NA, NA, NA, 1090.0, 37.1, 3040.0, 12300.0, 358.0,…
$ `1888`  <dbl> NA, NA, NA, NA, NA, NA, 891.0, 38.7, 3530.0, 12000.0, 373.0, …
$ `1889`  <dbl> NA, NA, NA, NA, NA, NA, 1760.0, 41.8, 3430.0, 12900.0, 403.0,…
$ `1890`  <dbl> NA, NA, NA, NA, NA, NA, 1370.0, 47.3, 3550.0, 13000.0, 457.0,…
$ `1891`  <dbl> NA, NA, NA, NA, NA, NA, 939.0, 52.1, 4010.0, 15000.0, 503.0, …
$ `1892`  <dbl> NA, NA, NA, NA, NA, NA, 1390.0, 55.1, 4150.0, 14500.0, 532.0,…
$ `1893`  <dbl> NA, NA, NA, NA, NA, NA, 1550.0, 64.6, 3970.0, 17700.0, 624.0,…
$ `1894`  <dbl> NA, NA, NA, NA, NA, NA, 1990.0, 65.8, 4360.0, 18100.0, 635.0,…
$ `1895`  <dbl> NA, NA, NA, NA, NA, NA, 2270.0, 75.6, 4590.0, 20400.0, 730.0,…
$ `1896`  <dbl> NA, NA, NA, NA, NA, NA, 2310, 77, 4510, 21300, 743, NA, NA, N…
$ `1897`  <dbl> NA, NA, NA, NA, NA, NA, 2080, 89, 4980, 23000, 859, NA, NA, N…
$ `1898`  <dbl> NA, NA, NA, NA, NA, NA, 2350.0, 99.9, 5620.0, 24500.0, 964.0,…
$ `1899`  <dbl> NA, NA, NA, NA, NA, NA, 2920, 116, 5790, 24800, 1120, NA, NA,…
$ `1900`  <dbl> NA, NA, NA, NA, NA, NA, 2070, 131, 10200, 27700, 1270, NA, NA…
$ `1901`  <dbl> NA, NA, NA, NA, NA, NA, 2490, 135, 11400, 28400, 1300, NA, NA…
$ `1902`  <dbl> NA, NA, NA, NA, NA, NA, 2820, 130, 11400, 25700, 1260, NA, NA…
$ `1903`  <dbl> NA, NA, NA, NA, NA, NA, 2860, 127, 11200, 25600, 1230, NA, NA…
$ `1904`  <dbl> NA, NA, NA, NA, NA, NA, 3800, 142, 11600, 26900, 1370, NA, NA…
$ `1905`  <dbl> NA, NA, NA, NA, NA, NA, 3990, 126, 12100, 28100, 1220, NA, NA…
$ `1906`  <dbl> NA, NA, NA, NA, NA, NA, 6260, 144, 14400, 33600, 1390, NA, NA…
$ `1907`  <dbl> NA, NA, NA, NA, NA, NA, 6260, 161, 15500, 42200, 1560, NA, NA…
$ `1908`  <dbl> NA, NA, NA, NA, NA, NA, 7620, 162, 16800, 59000, 1570, NA, NA…
$ `1909`  <dbl> NA, NA, NA, NA, NA, NA, 5940, 172, 14600, 42200, 1660, NA, NA…
$ `1910`  <dbl> NA, NA, NA, NA, NA, NA, 8910, 168, 17500, 57600, 1620, NA, NA…
$ `1911`  <dbl> NA, NA, NA, NA, NA, NA, 9950, 174, 19300, 48100, 1680, NA, NA…
$ `1912`  <dbl> NA, NA, NA, NA, NA, NA, 9490, 198, 20800, 50000, 1910, NA, NA…
$ `1913`  <dbl> NA, NA, NA, NA, NA, NA, 10200, 215, 22400, 59700, 2070, NA, N…
$ `1914`  <dbl> NA, NA, NA, NA, NA, NA, 8680, 194, 24500, 48900, 1870, NA, NA…
$ `1915`  <dbl> NA, NA, NA, NA, NA, NA, 6950, 178, 21800, 34900, 1720, NA, NA…
$ `1916`  <dbl> NA, NA, 3.67, NA, NA, NA, 4990.00, 189.00, 19300.00, 8040.00,…
$ `1917`  <dbl> NA, NA, 7.33, NA, NA, NA, 2230.00, 174.00, 20800.00, 3450.00,…
$ `1918`  <dbl> NA, NA, 18.3, NA, NA, NA, 2520.0, 69.5, 23000.0, 3340.0, 671.…
$ `1919`  <dbl> NA, NA, 18.3, NA, NA, NA, 3730.0, 59.4, 21800.0, 3020.0, 573.…
$ `1920`  <dbl> NA, NA, 22.0, NA, NA, NA, 5900.0, 54.2, 25800.0, 14500.0, 523…
$ `1921`  <dbl> NA, NA, 25.7, NA, NA, NA, 5540.0, 58.7, 23200.0, 19400.0, 567…
$ `1922`  <dbl> NA, NA, 25.7, NA, NA, NA, 7300.0, 71.6, 24400.0, 18600.0, 692…
$ `1923`  <dbl> NA, NA, 14.7, NA, NA, NA, 8450.0, 79.1, 24900.0, 17800.0, 764…
$ `1924`  <dbl> NA, NA, 29.3, NA, NA, NA, 11000.0, 94.3, 27100.0, 20100.0, 91…
$ `1925`  <dbl> NA, NA, 33.0, NA, NA, NA, 11200.0, 93.1, 28300.0, 19000.0, 89…
$ `1926`  <dbl> NA, NA, 40.3, NA, NA, NA, 11300.0, 135.0, 27900.0, 18600.0, 1…
$ `1927`  <dbl> NA, NA, 58.7, NA, NA, NA, 13400.0, 168.0, 28900.0, 20100.0, 1…
$ `1928`  <dbl> NA, NA, 73.30, NA, NA, NA, 12800.00, 186.00, 26300.00, 21200.…
$ `1929`  <dbl> NA, NA, 80.70, NA, NA, NA, 13100.00, 201.00, 23700.00, 24200.…
$ `1930`  <dbl> NA, NA, 84.30, NA, NA, NA, 12800.00, 273.00, 22000.00, 18900.…
$ `1931`  <dbl> NA, NA, 99.00, NA, NA, NA, 12900.00, 328.00, 19600.00, 18100.…
$ `1932`  <dbl> NA, NA, 114.00, NA, NA, NA, 13100.00, 369.00, 20400.00, 15200…
$ `1933`  <dbl> NA, 7.33, 121.00, NA, NA, NA, 13200.00, 412.00, 21600.00, 142…
$ `1934`  <dbl> NA, 7.33, 139.00, NA, NA, NA, 14300.00, 499.00, 22700.00, 138…
$ `1935`  <dbl> NA, 18.3, 132.0, NA, NA, NA, 14000.0, 565.0, 25300.0, 13900.0…
$ `1936`  <dbl> NA, 128.0, 51.3, NA, NA, NA, 15100.0, 648.0, 27100.0, 13600.0…
$ `1937`  <dbl> NA, 297.0, 69.7, NA, NA, NA, 16700.0, 662.0, 28900.0, 15300.0…
$ `1938`  <dbl> NA, 348, 33, NA, NA, NA, 16400, 699, 28100, 5790, 6750, NA, 3…
$ `1939`  <dbl> NA, 433.00, 161.00, NA, NA, NA, 17400.00, 707.00, 32200.00, 6…
$ `1940`  <dbl> NA, 693, 238, NA, NA, NA, 15900, 848, 29100, 7350, 8190, NA, …
$ `1941`  <dbl> NA, 627, 312, NA, NA, NA, 14000, 745, 34600, 7980, 7190, NA, …
$ `1942`  <dbl> NA, 744, 499, NA, NA, NA, 13500, 513, 36500, 8560, 4950, NA, …
$ `1943`  <dbl> NA, 462, 469, NA, NA, NA, 14100, 655, 35000, 9620, 6320, NA, …
$ `1944`  <dbl> NA, 154, 499, NA, NA, NA, 14000, 613, 34200, 9400, 5920, NA, …
$ `1945`  <dbl> NA, 121, 616, NA, NA, NA, 13700, 649, 32700, 4570, 6270, NA, …
$ `1946`  <dbl> NA, 484, 763, NA, NA, NA, 13700, 730, 35500, 12800, 7040, NA,…
$ `1947`  <dbl> NA, 928.00, 744.00, NA, NA, NA, 14500.00, 878.00, 38000.00, 1…
$ `1948`  <dbl> NA, 704.00, 803.00, NA, NA, NA, 17400.00, 935.00, 38500.00, 2…
$ `1949`  <dbl> 14.70, 1020.00, 909.00, NA, NA, NA, 15400.00, 1060.00, 37700.…
$ `1950`  <dbl> 84.3, 297.0, 3790.0, NA, 187.0, NA, 30000.0, 1180.0, 54800.0,…
$ `1951`  <dbl> 91.7, 403.0, 4140.0, NA, 249.0, NA, 35000.0, 1280.0, 59100.0,…
$ `1952`  <dbl> 91.7, 374.0, 3890.0, NA, 312.0, NA, 36100.0, 1370.0, 60300.0,…
$ `1953`  <dbl> 106.0, 414.0, 4000.0, NA, 275.0, NA, 35200.0, 1450.0, 59500.0…
$ `1954`  <dbl> 106.0, 502.0, 4160.0, NA, 348.0, NA, 36800.0, 1590.0, 67900.0…
$ `1955`  <dbl> 154.0, 664.0, 4610.0, NA, 414.0, NA, 39600.0, 1800.0, 70700.0…
$ `1956`  <dbl> 183.0, 840.0, 5000.0, NA, 502.0, NA, 44300.0, 1970.0, 73100.0…
$ `1957`  <dbl> 293.0, 1510.0, 5540.0, NA, 620.0, 22.0, 47700.0, 2160.0, 7460…
$ `1958`  <dbl> 330.0, 1200.0, 5220.0, NA, 594.0, 29.3, 44200.0, 2310.0, 7770…
$ `1959`  <dbl> 385.0, 1440.0, 5670.0, NA, 620.0, 29.3, 49000.0, 2430.0, 8380…
$ `1960`  <dbl> 414.0, 2020.0, 6160.0, NA, 550.0, 36.7, 48800.0, 2530.0, 8820…
$ `1961`  <dbl> 491.0, 2280.0, 6070.0, NA, 455.0, 47.7, 51200.0, 2600.0, 9060…
$ `1962`  <dbl> 689.0, 2460.0, 5670.0, NA, 1180.0, 103.0, 53700.0, 2730.0, 94…
$ `1963`  <dbl> 708.0, 2080.0, 5430.0, NA, 1150.0, 84.3, 50100.0, 2930.0, 101…
$ `1964`  <dbl> 840.0, 2020.0, 5650.0, NA, 1220.0, 91.7, 55700.0, 3120.0, 109…
$ `1965`  <dbl> 1010.0, 2170.0, 6600.0, NA, 1190.0, 150.0, 58900.0, 3310.0, 1…
$ `1966`  <dbl> 1090.0, 2550.0, 8430.0, NA, 1550.0, 348.0, 63100.0, 3490.0, 1…
$ `1967`  <dbl> 1280, 2680, 8440, NA, 994, 565, 65500, 3650, 129000, 40000, 3…
$ `1968`  <dbl> 1220, 3070, 9060, NA, 1670, 990, 69100, 3750, 135000, 42400, …
$ `1969`  <dbl> 942, 3250, 11300, NA, 2790, 1260, 77300, 3910, 142000, 44700,…
$ `1970`  <dbl> 1.67e+03, 3.74e+03, 1.51e+04, NA, 3.58e+03, 4.62e+02, 8.27e+0…
$ `1971`  <dbl> 1.90e+03, 4.35e+03, 1.87e+04, NA, 3.41e+03, 4.25e+02, 8.89e+0…
$ `1972`  <dbl> 1.53e+03, 5.64e+03, 2.83e+04, NA, 4.51e+03, 3.74e+02, 9.02e+0…
$ `1973`  <dbl> 1.64e+03, 5.29e+03, 3.83e+04, NA, 4.88e+03, 3.30e+02, 9.41e+0…
$ `1974`  <dbl> 1.92e+03, 4.35e+03, 3.19e+04, NA, 4.87e+03, 4.29e+02, 9.56e+0…
$ `1975`  <dbl> 2.13e+03, 4.59e+03, 3.20e+04, NA, 4.42e+03, 7.08e+02, 9.49e+0…
$ `1976`  <dbl> 1.99e+03, 4.95e+03, 3.92e+04, NA, 3.29e+03, 4.03e+02, 9.98e+0…
$ `1977`  <dbl> 2.39e+03, 5.72e+03, 4.19e+04, NA, 3.53e+03, 4.66e+02, 1.01e+0…
$ `1978`  <dbl> 2160, 6490, 62500, NA, 5410, 491, 103000, 5810, 202000, 57500…
$ `1979`  <dbl> 2240, 7590, 45600, NA, 5500, 407, 111000, 5850, 205000, 61600…
$ `1980`  <dbl> 1760, 5170, 66500, NA, 5350, 143, 109000, 6080, 221000, 52300…
$ `1981`  <dbl> 1980.0, 7340.0, 46400.0, NA, 5280.0, 106.0, 102000.0, 5970.0,…
$ `1982`  <dbl> 2100, 7310, 39300, NA, 4650, 293, 103000, 6080, 234000, 53900…
$ `1983`  <dbl> 2520.0, 7630.0, 52600.0, NA, 5120.0, 84.3, 105000.0, 6170.0, …
$ `1984`  <dbl> 2830.0, 7830.0, 71100.0, NA, 5010.0, 147.0, 107000.0, 6230.0,…
$ `1985`  <dbl> 3510.0, 7880.0, 72800.0, NA, 4700.0, 249.0, 101000.0, 6710.0,…
$ `1986`  <dbl> 3140, 8060, 76300, NA, 4660, 249, 104000, 6730, 240000, 54100…
$ `1987`  <dbl> 3120, 7440, 84100, NA, 5820, 275, 115000, 7020, 256000, 57700…
$ `1988`  <dbl> 2870, 7330, 83900, NA, 5130, 286, 121000, 7210, 261000, 53300…
$ `1989`  <dbl> 2780.0, 8980.0, 80000.0, NA, 5010.0, 286.0, 117000.0, 7060.0,…
$ `1990`  <dbl> 2610, 5520, 77000, 407, 5120, 282, 112000, 6620, 264000, 5770…
$ `1991`  <dbl> 2440, 4290, 79000, 407, 5090, 268, 117000, 6380, 261000, 6160…
$ `1992`  <dbl> 1390, 2520, 80100, 407, 5200, 264, 121000, 5830, 268000, 5670…
$ `1993`  <dbl> 1350, 2340, 82200, 411, 5780, 271, 118000, 2560, 277000, 5710…
$ `1994`  <dbl> 1290, 1930, 86400, 407, 3890, 268, 122000, 2710, 278000, 5710…
$ `1995`  <dbl> 1240, 2090, 95300, 425, 11000, 275, 128000, 3410, 282000, 598…
$ `1996`  <dbl> 1180, 2020, 97100, 455, 10500, 293, 135000, 2560, 302000, 632…
$ `1997`  <dbl> 1100, 1540, 87300, 466, 7380, 308, 138000, 3230, 306000, 6270…
$ `1998`  <dbl> 1040, 1750, 107000, 491, 7310, 319, 140000, 3360, 317000, 637…
$ `1999`  <dbl> 821, 2980, 92000, 513, 9160, 330, 147000, 3010, 325000, 61900…
$ `2000`  <dbl> 774, 3020, 87900, 524, 9540, 345, 142000, 3470, 329000, 62300…
$ `2001`  <dbl> 818, 3220, 84200, 524, 9730, 348, 134000, 3540, 325000, 65900…
$ `2002`  <dbl> 1070, 3750, 89900, 532, 12700, 370, 125000, 3040, 341000, 671…
$ `2003`  <dbl> 1200, 4290, 91600, 535, 9060, 403, 135000, 3430, 336000, 7220…
$ `2004`  <dbl> 950, 4170, 88500, 561, 18800, 422, 158000, 3640, 343000, 7240…
$ `2005`  <dbl> 1330, 4250, 107000, 576, 19200, 429, 162000, 4350, 350000, 74…
$ `2006`  <dbl> 1650, 3900, 101000, 546, 22300, 444, 175000, 4380, 365000, 72…
$ `2007`  <dbl> 2270, 3930, 109000, 539, 25200, 469, 175000, 5060, 372000, 69…
$ `2008`  <dbl> 4210, 4370, 110000, 539, 25700, 480, 189000, 5560, 386000, 69…
$ `2009`  <dbl> 6770, 4380, 121000, 517, 27800, 510, 180000, 4360, 395000, 62…
$ `2010`  <dbl> 8460, 4600, 119000, 517, 29100, 524, 188000, 4220, 391000, 67…
$ `2011`  <dbl> 12200, 5240, 121000, 491, 30300, 513, 192000, 4920, 392000, 6…
$ `2012`  <dbl> 10800, 4910, 130000, 488, 33400, 524, 192000, 5690, 388000, 6…
$ `2013`  <dbl> 10000, 5060, 134000, 477, 32600, 524, 190000, 5500, 372000, 6…
$ `2014`  <dbl> 9810, 5720, 145000, 462, 34800, 532, 204000, 5530, 361000, 58…

We can see that we have a large tibble. A tibble is the tidyverse version of a data frame. It is essentially a table with variable information arranged as columns, and individual observations arranged as rows. We can see that the tibble gives us information about the class of each variable. For example the country variable is made up of character (abbreviated as chr) values. We see that we have 265 different country variables and CO2 emission values for 192 different years (from 1751 to 2014). Recall that the values are emissions in metric tons also called tonnes. We can see that there are fewer NA values for later years.

Now we will modify this data to make it more usable for making visualizations. One thing we will use is the %<>% opperator which is from the magrittr package. This allows us to use our CO2_emissions data and reassign it to a modified version at the same time.

We will use the pivot_longer() function of the dplyr package to convert our data into what is called long format. This means that we will have more rows and fewer columns than our current format. This is done by collapsing multiple variables into fewer variables.

We want to collapse all of the values for the emission data across the different individual year variables into one new emission variable and we will identify what year they are from using a new Year variable.

# A tibble: 6 x 3
  country   Year  Emissions
  <chr>     <chr>     <dbl>
1 Syria     1971       8890
2 Sri Lanka 1992       5190
3 Palestine 1800         NA
4 Chad      2002        169
5 Panama    1869         NA
6 Greece    1939        253

We also want to rename the country variable to be capitalized. We can use the rename() function of the dplyr package to rename this variable. When renaming variables the new name is listed first before the =. We will also modify the Emissions data by dividing it by 1000 to make the numbers smaller. To do this we will use the mutate() function, which is also part of the dplyr() package. This function allows us to create and modify variables. You may also note that the Year variable is currently of class type character. We would like to change it to be numeric. This can also be accomplished using the mutate() function.

Now let’s take a look to see how our data has changed:

# A tibble: 6 x 4
  Country     Year Emissions Label                      
  <chr>      <dbl>     <dbl> <chr>                      
1 Benin       1958       125 CO2 Emissions (Metric Tons)
2 Bangladesh  1795        NA CO2 Emissions (Metric Tons)
3 Mongolia    1887        NA CO2 Emissions (Metric Tons)
4 Guyana      1968      1330 CO2 Emissions (Metric Tons)
5 Gambia      2008       367 CO2 Emissions (Metric Tons)
6 Botswana    1860        NA CO2 Emissions (Metric Tons)

Great, we can see that now the Year variable is of class double (abbreviated dbl), which is a numeric class.

Now let’s take a look at the Country variable just to check if there is anything unexpected. We will use the distinct() function of the dplyr package to view the unique values only.

# A tibble: 192 x 1
   Country            
   <chr>              
 1 Afghanistan        
 2 Albania            
 3 Algeria            
 4 Andorra            
 5 Angola             
 6 Antigua and Barbuda
 7 Argentina          
 8 Armenia            
 9 Australia          
10 Austria            
# … with 182 more rows

These all look as expected!

Yearly Growth in GDP per Capita

# A tibble: 6 x 220
  country   `1801`   `1802`   `1803`   `1804`   `1805`   `1806`   `1807`
  <chr>      <dbl>    <dbl>    <dbl>    <dbl>    <dbl>    <dbl>    <dbl>
1 Afghan… NA       NA       NA       NA       NA       NA       NA      
2 Albania  0.104    0.104    0.104    0.104    0.104    0.104    0.104  
3 Algeria -0.00247 -0.00247 -0.00247 -0.00247 -0.00247 -0.00247 -0.00247
4 Andorra  0.166    0.166    0.166    0.166    0.166    0.166    0.166  
5 Angola   0.425    0.425    0.425    0.425    0.425    0.425    0.425  
6 Antigu… NA       NA       NA       NA       NA       NA       NA      
# … with 212 more variables: `1808` <dbl>, `1809` <dbl>, `1810` <dbl>,
#   `1811` <dbl>, `1812` <dbl>, `1813` <dbl>, `1814` <dbl>, `1815` <dbl>,
#   `1816` <dbl>, `1817` <dbl>, `1818` <dbl>, `1819` <dbl>, `1820` <dbl>,
#   `1821` <dbl>, `1822` <dbl>, `1823` <dbl>, `1824` <dbl>, `1825` <dbl>,
#   `1826` <dbl>, `1827` <dbl>, `1828` <dbl>, `1829` <dbl>, `1830` <dbl>,
#   `1831` <dbl>, `1832` <dbl>, `1833` <dbl>, `1834` <dbl>, `1835` <dbl>,
#   `1836` <dbl>, `1837` <dbl>, `1838` <dbl>, `1839` <dbl>, `1840` <dbl>,
#   `1841` <dbl>, `1842` <dbl>, `1843` <dbl>, `1844` <dbl>, `1845` <dbl>,
#   `1846` <dbl>, `1847` <dbl>, `1848` <dbl>, `1849` <dbl>, `1850` <dbl>,
#   `1851` <dbl>, `1852` <dbl>, `1853` <dbl>, `1854` <dbl>, `1855` <dbl>,
#   `1856` <dbl>, `1857` <dbl>, `1858` <dbl>, `1859` <dbl>, `1860` <dbl>,
#   `1861` <dbl>, `1862` <dbl>, `1863` <dbl>, `1864` <dbl>, `1865` <dbl>,
#   `1866` <dbl>, `1867` <dbl>, `1868` <dbl>, `1869` <dbl>, `1870` <dbl>,
#   `1871` <dbl>, `1872` <dbl>, `1873` <dbl>, `1874` <dbl>, `1875` <dbl>,
#   `1876` <dbl>, `1877` <dbl>, `1878` <dbl>, `1879` <dbl>, `1880` <dbl>,
#   `1881` <dbl>, `1882` <dbl>, `1883` <dbl>, `1884` <dbl>, `1885` <dbl>,
#   `1886` <dbl>, `1887` <dbl>, `1888` <dbl>, `1889` <dbl>, `1890` <dbl>,
#   `1891` <dbl>, `1892` <dbl>, `1893` <dbl>, `1894` <dbl>, `1895` <dbl>,
#   `1896` <dbl>, `1897` <dbl>, `1898` <dbl>, `1899` <dbl>, `1900` <dbl>,
#   `1901` <dbl>, `1902` <dbl>, `1903` <dbl>, `1904` <dbl>, `1905` <dbl>,
#   `1906` <dbl>, `1907` <dbl>, …
  [1] "country" "1801"    "1802"    "1803"    "1804"    "1805"    "1806"   
  [8] "1807"    "1808"    "1809"    "1810"    "1811"    "1812"    "1813"   
 [15] "1814"    "1815"    "1816"    "1817"    "1818"    "1819"    "1820"   
 [22] "1821"    "1822"    "1823"    "1824"    "1825"    "1826"    "1827"   
 [29] "1828"    "1829"    "1830"    "1831"    "1832"    "1833"    "1834"   
 [36] "1835"    "1836"    "1837"    "1838"    "1839"    "1840"    "1841"   
 [43] "1842"    "1843"    "1844"    "1845"    "1846"    "1847"    "1848"   
 [50] "1849"    "1850"    "1851"    "1852"    "1853"    "1854"    "1855"   
 [57] "1856"    "1857"    "1858"    "1859"    "1860"    "1861"    "1862"   
 [64] "1863"    "1864"    "1865"    "1866"    "1867"    "1868"    "1869"   
 [71] "1870"    "1871"    "1872"    "1873"    "1874"    "1875"    "1876"   
 [78] "1877"    "1878"    "1879"    "1880"    "1881"    "1882"    "1883"   
 [85] "1884"    "1885"    "1886"    "1887"    "1888"    "1889"    "1890"   
 [92] "1891"    "1892"    "1893"    "1894"    "1895"    "1896"    "1897"   
 [99] "1898"    "1899"    "1900"    "1901"    "1902"    "1903"    "1904"   
[106] "1905"    "1906"    "1907"    "1908"    "1909"    "1910"    "1911"   
[113] "1912"    "1913"    "1914"    "1915"    "1916"    "1917"    "1918"   
[120] "1919"    "1920"    "1921"    "1922"    "1923"    "1924"    "1925"   
[127] "1926"    "1927"    "1928"    "1929"    "1930"    "1931"    "1932"   
[134] "1933"    "1934"    "1935"    "1936"    "1937"    "1938"    "1939"   
[141] "1940"    "1941"    "1942"    "1943"    "1944"    "1945"    "1946"   
[148] "1947"    "1948"    "1949"    "1950"    "1951"    "1952"    "1953"   
[155] "1954"    "1955"    "1956"    "1957"    "1958"    "1959"    "1960"   
[162] "1961"    "1962"    "1963"    "1964"    "1965"    "1966"    "1967"   
[169] "1968"    "1969"    "1970"    "1971"    "1972"    "1973"    "1974"   
[176] "1975"    "1976"    "1977"    "1978"    "1979"    "1980"    "1981"   
[183] "1982"    "1983"    "1984"    "1985"    "1986"    "1987"    "1988"   
[190] "1989"    "1990"    "1991"    "1992"    "1993"    "1994"    "1995"   
[197] "1996"    "1997"    "1998"    "1999"    "2000"    "2001"    "2002"   
[204] "2003"    "2004"    "2005"    "2006"    "2007"    "2008"    "2009"   
[211] "2010"    "2011"    "2012"    "2013"    "2014"    "2015"    "2016"   
[218] "2017"    "2018"    "2019"   

Rows: 194
Columns: 220
$ country <chr> "Afghanistan", "Albania", "Algeria", "Andorra", "Angola", "An…
$ `1801`  <dbl> NA, 0.10400, -0.00247, 0.16600, 0.42500, NA, NA, NA, 0.21600,…
$ `1802`  <dbl> NA, 0.10400, -0.00247, 0.16600, 0.42500, NA, NA, NA, 0.21600,…
$ `1803`  <dbl> NA, 0.10400, -0.00247, 0.16600, 0.42500, NA, NA, NA, 0.21600,…
$ `1804`  <dbl> NA, 0.10400, -0.00247, 0.16600, 0.42500, NA, NA, NA, 0.21600,…
$ `1805`  <dbl> NA, 0.10400, -0.00247, 0.16600, 0.42500, NA, NA, NA, 0.21600,…
$ `1806`  <dbl> NA, 0.10400, -0.00247, 0.16600, 0.42500, NA, NA, NA, 0.21600,…
$ `1807`  <dbl> NA, 0.10400, -0.00247, 0.16600, 0.42500, NA, NA, NA, 0.21600,…
$ `1808`  <dbl> NA, 0.10400, -0.00247, 0.16600, 0.42500, NA, NA, NA, 0.21600,…
$ `1809`  <dbl> NA, 0.10400, -0.00247, 0.16600, 0.42500, NA, NA, NA, 0.21600,…
$ `1810`  <dbl> NA, 0.10400, -0.00247, 0.16600, 0.42500, NA, NA, NA, 0.21600,…
$ `1811`  <dbl> NA, 0.10400, -0.00247, 0.16600, 0.42500, NA, NA, NA, 0.21600,…
$ `1812`  <dbl> NA, 0.10400, -0.00247, 0.16600, 0.42500, NA, NA, NA, 0.21600,…
$ `1813`  <dbl> NA, 0.10400, -0.00247, 0.16600, 0.42500, NA, NA, NA, 0.21600,…
$ `1814`  <dbl> NA, 0.10400, -0.00247, 0.16600, 0.42500, NA, NA, NA, 0.21600,…
$ `1815`  <dbl> NA, 0.10400, -0.00247, 0.16600, 0.42500, NA, NA, NA, 0.21600,…
$ `1816`  <dbl> NA, 0.10400, -0.00247, 0.16600, 0.42500, NA, NA, NA, 0.21600,…
$ `1817`  <dbl> NA, 0.10400, -0.00247, 0.16600, 0.42500, NA, NA, NA, 0.21600,…
$ `1818`  <dbl> NA, 0.10400, -0.00247, 0.16600, 0.42500, NA, NA, NA, 0.21600,…
$ `1819`  <dbl> NA, 0.10400, -0.00247, 0.16600, 0.42500, NA, NA, NA, 0.21600,…
$ `1820`  <dbl> NA, 0.10400, -0.00247, 0.16600, 0.42500, NA, NA, NA, 0.21600,…
$ `1821`  <dbl> 0.32500, 0.21300, 1.02000, 1.17000, 0.42500, 0.66100, 1.41000…
$ `1822`  <dbl> 0.32500, 0.21300, 1.02000, 1.17000, 0.42500, 0.66100, 1.41000…
$ `1823`  <dbl> 0.32500, 0.21300, 1.02000, 1.17000, 0.42500, 0.66100, 1.41000…
$ `1824`  <dbl> 0.32500, 0.21300, 1.02000, 1.17000, 0.42500, 0.66100, 1.41000…
$ `1825`  <dbl> 0.32500, 0.21300, 1.02000, 1.17000, 0.42500, 0.66100, 1.41000…
$ `1826`  <dbl> 0.32500, 0.21300, 1.02000, 1.17000, 0.42500, 0.66100, 1.41000…
$ `1827`  <dbl> 0.32500, 0.21300, 1.02000, 1.17000, 0.42500, 0.66100, 1.41000…
$ `1828`  <dbl> 0.32500, 0.21300, 1.02000, 1.17000, 0.42500, 0.66100, 1.41000…
$ `1829`  <dbl> 0.32500, 0.21300, 1.02000, 1.17000, 0.42500, 0.66100, 1.41000…
$ `1830`  <dbl> 0.32500, 0.21300, 1.02000, 1.17000, 0.42500, 0.66100, 1.41000…
$ `1831`  <dbl> 0.32500, 0.21300, 1.02000, 1.17000, 0.42500, 0.66100, 1.41000…
$ `1832`  <dbl> 0.32500, 0.21300, 1.02000, 1.17000, 0.42500, 0.66100, 1.41000…
$ `1833`  <dbl> 0.32500, 0.21300, 1.02000, 1.17000, 0.42500, 0.66100, 1.41000…
$ `1834`  <dbl> 0.32500, 0.21300, 1.02000, 1.17000, 0.42500, 0.66100, 1.41000…
$ `1835`  <dbl> 0.32500, 0.21300, 1.02000, 1.17000, 0.42500, 0.66100, 1.41000…
$ `1836`  <dbl> 0.32500, 0.21300, 1.02000, 1.17000, 0.42500, 0.66100, 1.41000…
$ `1837`  <dbl> 0.32500, 0.21300, 1.02000, 1.17000, 0.42500, 0.66100, 1.41000…
$ `1838`  <dbl> 0.32500, 0.21300, 1.02000, 1.17000, 0.42500, 0.66100, 1.41000…
$ `1839`  <dbl> 0.32500, 0.21300, 1.02000, 1.17000, 0.42500, 0.66100, 1.41000…
$ `1840`  <dbl> 0.32500, 0.21300, 1.02000, 1.17000, 0.42500, 0.66100, 1.41000…
$ `1841`  <dbl> 0.32500, 0.21300, 1.02000, 1.17000, 0.42500, 0.66100, 1.41000…
$ `1842`  <dbl> 0.32500, 0.21300, 1.02000, 1.17000, 0.42500, 0.66100, 1.41000…
$ `1843`  <dbl> 0.32500, 0.21300, 1.02000, 1.17000, 0.42500, 0.66100, 1.41000…
$ `1844`  <dbl> 0.32500, 0.21300, 1.02000, 1.17000, 0.42500, 0.66100, 1.41000…
$ `1845`  <dbl> 0.32500, 0.21300, 1.02000, 1.17000, 0.42500, 0.66100, 1.41000…
$ `1846`  <dbl> 0.32500, 0.21300, 1.02000, 1.17000, 0.42500, 0.66100, 1.41000…
$ `1847`  <dbl> 0.32500, 0.21300, 1.02000, 1.17000, 0.42500, 0.66100, 1.41000…
$ `1848`  <dbl> 0.32500, 0.21300, 1.02000, 1.17000, 0.42500, 0.66100, 1.41000…
$ `1849`  <dbl> 0.32500, 0.21300, 1.02000, 1.17000, 0.42500, 0.66100, 1.41000…
$ `1850`  <dbl> 0.32500, 0.21300, 1.02000, 1.17000, 0.42500, 0.66100, 1.41000…
$ `1851`  <dbl> 0.32500, 0.21300, 1.02000, 1.17000, 0.42500, 0.66100, 1.41000…
$ `1852`  <dbl> 0.32500, 0.21300, 1.02000, 1.17000, 0.42500, 0.66100, 1.41000…
$ `1853`  <dbl> 0.32500, 0.21300, 1.02000, 1.17000, 0.42500, 0.66100, 1.41000…
$ `1854`  <dbl> 0.32500, 0.21300, 1.02000, 1.17000, 0.42500, 0.66100, 1.41000…
$ `1855`  <dbl> 0.32500, 0.21300, 1.02000, 1.17000, 0.42500, 0.66100, 1.41000…
$ `1856`  <dbl> 0.32500, 0.21300, 1.02000, 1.17000, 0.42500, 0.66100, 1.41000…
$ `1857`  <dbl> 0.32500, 0.21300, 1.02000, 1.17000, 0.42500, 0.66100, 1.41000…
$ `1858`  <dbl> 0.32500, 0.21300, 1.02000, 1.17000, 0.42500, 0.66100, 1.41000…
$ `1859`  <dbl> 0.32500, 0.21300, 1.02000, 1.17000, 0.42500, 0.66100, 1.41000…
$ `1860`  <dbl> 0.32500, 0.21300, 1.02000, 1.17000, 0.42500, 0.66100, 1.41000…
$ `1861`  <dbl> 0.32500, 0.21300, 1.02000, 1.17000, 0.42500, 0.66100, 1.41000…
$ `1862`  <dbl> 0.32500, 0.21300, 1.02000, 1.17000, 0.42500, 0.66100, 1.41000…
$ `1863`  <dbl> 0.32500, 0.21300, 1.02000, 1.17000, 0.42500, 0.66100, 1.41000…
$ `1864`  <dbl> 0.32500, 0.21300, 1.02000, 1.17000, 0.42500, 0.66100, 1.41000…
$ `1865`  <dbl> 0.32500, 0.21300, 1.02000, 1.17000, 0.42500, 0.66100, 1.41000…
$ `1866`  <dbl> 0.32500, 0.21300, 1.02000, 1.17000, 0.42500, 0.66100, 1.41000…
$ `1867`  <dbl> 0.32500, 0.21300, 1.02000, 1.17000, 0.42500, 0.66100, 1.41000…
$ `1868`  <dbl> 0.32500, 0.21300, 1.02000, 1.17000, 0.42500, 0.66100, 1.41000…
$ `1869`  <dbl> 0.32500, 0.21300, 1.02000, 1.17000, 0.42500, 0.66100, 1.41000…
$ `1870`  <dbl> 0.32500, 0.21300, 1.02000, 1.17000, 0.42500, 0.66100, 1.41000…
$ `1871`  <dbl> 0.325, 1.470, 1.140, 1.170, 0.425, 0.661, 1.410, 0.371, 0.772…
$ `1872`  <dbl> 0.3250, 1.4700, 1.1400, 1.1700, 0.4250, 0.6610, 1.4100, 0.371…
$ `1873`  <dbl> 0.325, 1.470, 1.140, 1.170, 0.425, 0.661, 1.410, 0.371, 7.600…
$ `1874`  <dbl> 0.325, 1.470, 1.140, 1.170, 0.425, 0.661, 1.410, 0.371, 0.292…
$ `1875`  <dbl> 0.325, 1.470, 1.140, 1.170, 0.425, 0.661, 1.410, 0.371, 7.910…
$ `1876`  <dbl> 0.325, 1.470, 1.140, 1.170, 0.425, 0.661, -0.952, 0.371, -3.1…
$ `1877`  <dbl> 0.325, 1.470, 1.140, 1.170, 0.425, 0.661, 7.210, 0.371, 0.720…
$ `1878`  <dbl> 0.325, 1.470, 1.140, 1.170, 0.425, 0.661, -8.110, 0.371, 5.98…
$ `1879`  <dbl> 0.3250, 1.4700, 1.1400, 1.1700, 0.4250, 0.6610, 1.2700, 0.371…
$ `1880`  <dbl> 0.325, 1.470, 1.140, 1.170, 0.425, 0.661, -5.020, 0.371, 1.91…
$ `1881`  <dbl> 0.325, 1.470, 1.140, 1.170, 0.425, 0.661, -1.500, 0.371, 3.95…
$ `1882`  <dbl> 0.3250, 1.4700, 1.1400, 1.1700, 0.4250, 0.6610, 22.8000, 0.37…
$ `1883`  <dbl> 0.325, 1.470, 1.140, 1.170, 0.425, 0.661, 9.000, 0.371, 10.20…
$ `1884`  <dbl> 0.325, 1.470, 1.140, 1.170, 0.425, 0.661, 3.980, 0.371, -3.84…
$ `1885`  <dbl> 0.3250, 1.4700, 1.1400, 1.1700, 0.4250, 0.6610, 14.2000, 0.37…
$ `1886`  <dbl> 0.325, 1.470, 1.140, 1.170, 0.425, 0.661, -2.700, -4.080, -2.…
$ `1887`  <dbl> 0.325, 1.470, 1.140, 1.170, 0.425, 0.661, 3.690, 16.700, 6.98…
$ `1888`  <dbl> 0.325, 1.470, 1.140, 1.170, 0.425, 0.661, 12.900, -4.020, -2.…
$ `1889`  <dbl> 0.325, 1.470, 1.140, 1.170, 0.425, 0.661, 6.590, -7.220, 5.40…
$ `1890`  <dbl> 0.325, 1.470, 1.140, 1.170, 0.425, 0.661, -11.300, -0.635, -6…
$ `1891`  <dbl> 0.325, 1.370, 1.140, 1.170, 0.425, 0.661, -8.460, -8.610, 4.6…
$ `1892`  <dbl> 0.325, 1.370, 1.140, 1.170, 0.425, 0.661, 16.300, 9.230, -14.…
$ `1893`  <dbl> 0.325, 1.370, 1.140, 1.170, 0.425, 0.661, 2.840, 13.100, -7.2…
$ `1894`  <dbl> 0.325, 1.370, 1.140, 1.170, 0.425, 0.661, 12.200, 13.400, 1.5…
$ `1895`  <dbl> 0.325, 1.370, 1.140, 1.170, 0.425, 0.661, 7.760, -7.670, -7.3…
$ `1896`  <dbl> 0.325, 1.370, 1.140, 1.170, 0.425, 0.661, 7.520, 9.890, 5.670…
$ `1897`  <dbl> 0.325, 1.370, 1.140, 1.170, 0.425, 0.661, -21.900, -1.890, -7…
$ `1898`  <dbl> 0.3250, 1.3700, 1.1400, 1.1700, 0.4250, 0.6610, 5.4600, 2.430…
$ `1899`  <dbl> 0.325, 1.370, 1.140, 1.170, 0.425, 0.661, 14.700, 5.880, -1.3…
$ `1900`  <dbl> 0.3250, 1.3700, 1.1400, 1.1700, 0.4250, 0.6610, -14.8000, -2.…
$ `1901`  <dbl> 0.325, 1.310, 1.140, 1.170, 0.425, 0.661, 5.620, 2.270, -4.35…
$ `1902`  <dbl> 0.325, 1.310, 1.140, 1.170, 0.425, 0.661, -4.850, 8.420, -0.4…
$ `1903`  <dbl> 0.3250, 1.3100, 1.1400, 1.1700, 0.4250, 0.6610, 11.5000, -7.1…
$ `1904`  <dbl> 0.325, 1.310, 1.140, 1.170, 0.425, 0.661, 7.830, 10.300, 5.36…
$ `1905`  <dbl> 0.325, 1.310, 1.140, 1.170, 0.425, 0.661, 10.400, -11.700, -0…
$ `1906`  <dbl> 0.325, 1.310, 1.140, 1.170, 0.425, 0.661, 0.392, -4.640, 5.26…
$ `1907`  <dbl> 0.325, 1.310, 1.140, 1.170, 0.425, 0.661, -2.530, -4.130, 2.4…
$ `1908`  <dbl> 0.3250, 1.3100, 1.1400, 1.1700, 0.4250, 0.6610, 5.1600, 8.960…
$ `1909`  <dbl> 0.325, 1.310, 1.140, 1.170, 0.425, 0.661, 0.294, 3.590, 6.130…
$ `1910`  <dbl> 0.325, 1.310, 1.140, 1.170, 0.425, 0.661, 2.640, 6.460, 4.600…
$ `1911`  <dbl> 0.32500, 1.28000, 1.14000, 1.17000, 0.42500, 0.66100, -2.2000…
$ `1912`  <dbl> 0.32500, 1.28000, 1.14000, 1.17000, 0.42500, 0.66100, 4.17000…
$ `1913`  <dbl> 0.32500, 1.28000, 1.14000, 1.17000, 0.42500, 0.66100, -2.9600…
$ `1914`  <dbl> 0.463, 0.837, 0.432, 3.800, 2.960, 2.450, -14.300, -4.720, -2…
$ `1915`  <dbl> 0.463, 0.837, 0.432, 3.800, 2.960, 2.450, -3.470, 2.690, -2.5…
$ `1916`  <dbl> 0.463, 0.837, 0.432, 3.800, 2.960, 2.450, -4.610, -3.150, -0.…
$ `1917`  <dbl> 0.463, 0.837, 0.432, 3.800, 2.960, 2.450, -9.830, -16.700, -1…
$ `1918`  <dbl> 0.463, 0.837, 0.432, 3.800, 2.960, 2.450, 16.600, -16.700, -3…
$ `1919`  <dbl> 0.463, 0.837, 0.432, 3.800, 2.960, 2.450, 1.950, -16.700, 2.4…
$ `1920`  <dbl> 0.463, 0.837, 0.432, 3.800, 2.960, 2.450, 5.550, -5.070, 1.06…
$ `1921`  <dbl> 0.463, 0.837, 0.432, 3.800, 2.960, 2.450, -0.488, -5.070, 3.0…
$ `1922`  <dbl> 0.463, 0.837, 0.432, 3.800, 2.960, 2.450, 4.950, 8.450, 3.110…
$ `1923`  <dbl> 0.463, 0.837, 0.432, 3.800, 2.960, 2.450, 7.970, 8.450, 2.540…
$ `1924`  <dbl> 0.463, 0.837, 0.432, 3.800, 2.960, 2.450, 4.750, 8.450, 4.340…
$ `1925`  <dbl> 0.463, 0.837, 0.432, 3.800, 2.960, 2.450, -3.460, 8.450, 2.50…
$ `1926`  <dbl> 0.463, 0.837, 0.432, 3.800, 2.960, 2.450, 2.080, 8.450, 0.351…
$ `1927`  <dbl> 0.463, 0.837, 0.432, 3.800, 2.960, 2.450, 4.350, 8.450, -0.51…
$ `1928`  <dbl> 0.46300, 0.83700, 0.43200, 3.80000, 2.96000, 2.45000, 3.45000…
$ `1929`  <dbl> 0.463, 0.837, 0.432, 3.800, 2.960, 2.450, 1.860, 8.450, -3.46…
$ `1930`  <dbl> 0.463, 0.372, 0.432, 3.800, 2.960, 2.450, -6.880, 4.280, -10.…
$ `1931`  <dbl> 0.463, 0.372, 0.432, 3.800, 2.960, 2.450, -8.810, 0.680, -7.5…
$ `1932`  <dbl> 0.463, 0.372, 0.432, 3.800, 2.960, 2.450, -5.180, -1.760, 4.8…
$ `1933`  <dbl> 0.463, 0.372, 0.432, 3.800, 2.960, 2.450, 2.830, 3.530, 6.110…
$ `1934`  <dbl> 0.463, 0.372, 0.432, 3.800, 2.960, 2.450, 6.020, 8.930, 4.490…
$ `1935`  <dbl> 0.463, 0.372, 0.432, 3.800, 2.960, 2.450, 2.480, 14.100, 5.09…
$ `1936`  <dbl> 0.463, 0.372, 0.432, 3.800, 2.960, 2.450, -0.737, 6.560, 3.73…
$ `1937`  <dbl> 0.463, 0.372, 0.432, 3.800, 2.960, 2.450, 5.680, 8.050, 4.170…
$ `1938`  <dbl> 0.463, 0.372, 0.432, 3.800, 2.960, 2.450, -1.260, -0.505, 2.4…
$ `1939`  <dbl> 0.463, 0.372, 0.432, 3.800, 2.960, 2.450, 2.260, 3.820, -0.69…
$ `1940`  <dbl> 0.4630, 0.3720, 0.4320, 3.8000, 2.9600, 2.4500, 0.0522, -4.38…
$ `1941`  <dbl> 0.463, 0.372, 0.432, 3.800, 2.960, 2.450, 3.670, -2.100, 10.1…
$ `1942`  <dbl> 0.463, 0.372, 0.432, 3.800, 2.960, 2.450, -0.457, -2.100, 10.…
$ `1943`  <dbl> 0.463, 0.372, 0.432, 3.800, 2.960, 2.450, -2.240, -2.100, 2.6…
$ `1944`  <dbl> 0.463, 0.372, 0.432, 3.800, 2.960, 2.450, 9.710, -2.100, -4.4…
$ `1945`  <dbl> 0.463, 0.372, 0.432, 3.800, 2.960, 2.450, -4.770, -2.100, -6.…
$ `1946`  <dbl> 0.463, 0.372, 0.432, 3.800, 2.960, 2.450, 6.610, -2.100, -4.6…
$ `1947`  <dbl> 0.4630, 0.3720, 0.4320, 3.8000, 2.9600, 2.4500, 8.8000, 10.90…
$ `1948`  <dbl> 0.463, 0.372, 0.432, 3.800, 2.960, 2.450, 3.160, 12.700, 4.55…
$ `1949`  <dbl> 0.463, 0.372, 0.432, 3.800, 2.960, 2.450, -3.620, 8.980, 3.87…
$ `1950`  <dbl> 0.463, 0.372, 0.432, 3.800, 2.960, 2.450, -1.110, 8.070, 2.42…
$ `1951`  <dbl> 1.250, 4.320, -1.300, 3.800, 2.320, 2.450, 1.750, -1.470, 1.2…
$ `1952`  <dbl> 1.660, 0.160, 2.150, 3.800, 2.320, 2.450, -7.090, 4.430, -1.1…
$ `1953`  <dbl> 4.290, 4.040, -0.517, 3.800, 2.220, 2.450, 3.320, 2.360, 1.18…
$ `1954`  <dbl> 0.3080, 2.9400, 4.9900, 3.8000, -4.1100, 2.4500, 2.2100, 2.87…
$ `1955`  <dbl> 0.129, 5.390, 0.573, 3.800, 6.410, 2.450, 5.200, 6.420, 3.040…
$ `1956`  <dbl> 2.530, 1.010, 7.460, 3.800, -3.350, 2.450, 0.962, 7.410, 1.01…
$ `1957`  <dbl> -1.9400, 6.4100, 9.0300, 3.8000, 7.8600, 2.4500, 3.4200, 0.04…
$ `1958`  <dbl> 3.520, 4.500, 1.510, 3.800, 3.620, 2.450, 4.390, 5.390, 2.660…
$ `1959`  <dbl> 0.764, 4.120, 16.000, 3.800, -1.230, 2.450, -8.140, -3.080, 3…
$ `1960`  <dbl> 1.430, 5.060, 4.750, 3.800, 2.260, 2.450, 6.220, 7.290, 1.880…
$ `1961`  <dbl> -1.280, 0.831, -13.800, 3.800, 11.400, 2.450, 5.480, 3.870, -…
$ `1962`  <dbl> -0.497, 3.310, -20.400, 3.800, -4.360, 2.450, -3.180, 1.030, …
$ `1963`  <dbl> -0.429, 3.410, 23.400, 3.800, 3.380, 2.450, -3.930, -3.740, 4…
$ `1964`  <dbl> -0.374, 3.420, 2.160, 3.800, 9.360, 2.450, 8.760, 11.400, 4.7…
$ `1965`  <dbl> -0.124, 3.650, 3.530, 3.800, 5.710, 2.450, 7.640, 4.390, 3.08…
$ `1966`  <dbl> -1.370, 3.750, -7.730, 3.800, 4.040, 2.450, -0.829, 3.670, 0.…
$ `1967`  <dbl> 0.310, 3.760, 5.740, 3.800, 4.040, 2.450, 1.220, 3.310, 4.800…
$ `1968`  <dbl> 1.06, 3.61, 8.40, 3.80, -3.19, 2.45, 2.87, 4.81, 3.87, 3.90, …
$ `1969`  <dbl> -0.883, 3.400, 6.480, 3.800, 1.150, 2.450, 7.080, 0.450, 3.70…
$ `1970`  <dbl> -0.514, 3.690, 6.830, 3.800, 4.510, 2.450, 3.850, 6.690, 4.00…
$ `1971`  <dbl> -7.160, 4.000, -11.100, -0.603, 3.880, 4.800, 2.130, 1.650, 2…
$ `1972`  <dbl> -4.360, 3.920, 17.500, 2.760, -1.970, 4.720, 0.370, -0.430, 0…
$ `1973`  <dbl> 8.580, 4.980, 0.285, 2.630, 5.680, 6.090, 2.020, 7.380, 3.820…
$ `1974`  <dbl> 2.750, 0.373, 3.010, 0.870, 0.714, 1.700, 3.700, 1.070, 0.831…
$ `1975`  <dbl> 2.5300, 0.3480, 3.8900, -3.5900, -7.3700, -6.2900, -2.2400, -…
$ `1976`  <dbl> 2.330, 0.400, 3.420, -0.531, -7.630, -8.910, -1.580, 2.850, 2…
$ `1977`  <dbl> -9.2400, 0.4380, 5.7700, -0.6340, -1.8700, 8.2100, 4.8600, 0.…
$ `1978`  <dbl> 5.210, 0.460, 9.420, -1.920, -7.870, 4.990, -4.730, 0.760, 1.…
$ `1979`  <dbl> -2.180, 0.487, 5.750, -3.670, -2.600, 12.600, 5.440, -2.140, …
$ `1980`  <dbl> 0.1680, 0.7060, -1.2600, -2.1000, -0.4710, 8.3500, 0.0163, -1…
$ `1981`  <dbl> 10.700, 0.536, -0.656, -4.970, -7.610, 6.330, -6.960, -0.756,…
$ `1982`  <dbl> 9.0500, 0.5500, 3.0800, -4.0500, -3.5200, 1.5500, -4.5000, 0.…
$ `1983`  <dbl> 3.59000, 0.58400, 1.89000, -3.47000, 0.52000, 8.03000, 2.6700…
$ `1984`  <dbl> -1.830, 0.569, 2.270, -2.810, 2.440, 8.850, 0.681, -0.516, 5.…
$ `1985`  <dbl> -3.280, 0.523, 2.020, -1.370, 0.316, 9.540, -8.340, -0.847, 3…
$ `1986`  <dbl> 7.170, 0.635, -3.790, 0.612, 0.332, 10.700, 5.880, 2.330, 0.6…
$ `1987`  <dbl> -17.3000, 0.6290, -3.3100, 3.7300, 4.3100, 11.3000, 1.2500, -…
$ `1988`  <dbl> -9.660, 0.633, -4.670, 3.540, 3.020, 10.000, -3.220, 0.453, 2…
$ `1989`  <dbl> -2.410, 0.754, 0.771, 2.780, -2.140, 7.540, -8.340, 0.135, 2.…
$ `1990`  <dbl> -5.5800, 0.8930, -3.9100, 0.8110, -3.1700, 3.2300, -3.2200, -…
$ `1991`  <dbl> -0.572, -28.900, -3.490, -1.470, -2.030, 1.540, 9.290, -13.30…
$ `1992`  <dbl> -7.950, -8.100, -0.752, -3.740, -8.830, -0.632, 8.540, -40.80…
$ `1993`  <dbl> -13.900, 8.780, -4.440, -5.650, -26.400, 3.080, 4.660, -4.660…
$ `1994`  <dbl> -10.400, 7.440, -3.070, -1.650, -1.860, 3.660, 4.770, 8.960, …
$ `1995`  <dbl> 20.300, 12.600, 1.710, -0.114, 11.600, -6.630, -3.910, 8.900,…
$ `1996`  <dbl> 2.660, 8.650, 1.940, 3.090, 16.600, 3.900, 4.460, 6.080, 2.48…
$ `1997`  <dbl> 2.8200, -10.6000, -0.5580, 8.5900, 2.7000, 2.3400, 7.0500, 3.…
$ `1998`  <dbl> 2.8300, 12.3000, 3.5000, 3.3000, -2.6300, 1.8200, 2.7900, 7.6…
$ `1999`  <dbl> 2.7100, 9.5800, 1.6800, 4.0100, 0.3870, 1.6900, -4.4500, 3.35…
$ `2000`  <dbl> -1.0500, 6.7900, 0.9950, 0.4010, -0.0561, -0.6830, -1.8500, 6…
$ `2001`  <dbl> -10.400, 6.690, 1.130, 10.000, -0.171, 0.251, -5.470, 10.100,…
$ `2002`  <dbl> 22.1000, 2.8600, 2.5500, 3.5800, 10.7000, 0.8110, -12.0000, 1…
$ `2003`  <dbl> 8.040, 5.450, 5.460, 4.170, -0.247, 3.670, 7.770, 14.400, 3.0…
$ `2004`  <dbl> 2.5000, 5.3600, 3.8400, 4.1800, 7.4500, 5.7500, 7.9200, 10.90…
$ `2005`  <dbl> 8.6100, 4.9600, 3.8000, 4.2100, 16.6000, 3.2900, 8.1200, 14.3…
$ `2006`  <dbl> 1.590, 5.270, 0.188, 2.370, 15.000, 11.300, 7.250, 13.100, 1.…
$ `2007`  <dbl> 10.800, 5.410, 1.850, -1.700, 19.600, 5.780, 7.440, 13.600, 2…
$ `2008`  <dbl> 0.117, 6.840, 0.472, -5.600, 10.600, 0.378, 5.570, 6.690, 0.7…
$ `2009`  <dbl> 17.300, 2.910, 0.179, -6.310, -0.464, -11.700, -0.276, -15.00…
$ `2010`  <dbl> 5.1700, 2.9800, 2.0600, -4.7800, 0.5940, -8.5300, 7.9400, 1.1…
$ `2011`  <dbl> 3.8500, 2.4900, 0.8570, -4.3000, 1.0300, -2.9600, 7.6500, 3.6…
$ `2012`  <dbl> 11.200, 2.280, 1.160, NA, 2.130, 2.790, 0.761, 6.920, 1.780, …
$ `2013`  <dbl> 1.130, 1.720, 1.610, NA, 1.030, 0.468, 3.090, 2.980, 1.170, 0…
$ `2014`  <dbl> 0.837, 2.610, 2.180, NA, 2.240, 1.620, -0.622, 4.050, 1.410, …
$ `2015`  <dbl> 2.110, 3.820, 2.100, NA, 2.460, 1.900, -0.128, 4.290, 1.480, …
$ `2016`  <dbl> 2.680, 4.720, 2.360, NA, 2.770, 2.200, 0.367, 4.490, 1.730, 1…
$ `2017`  <dbl> 2.760, 5.030, 2.500, NA, 0.262, 2.200, 0.861, 4.790, 1.700, 1…
$ `2018`  <dbl> 3.020, 5.030, 2.630, NA, 3.460, 2.200, 0.861, 4.790, 1.710, 1…
$ `2019`  <dbl> 3.380, 5.230, 2.680, NA, 3.550, 2.200, 0.861, 4.790, 1.770, 0…

Again, we will use the pivot_longer() to transform the data to long format. We will also again change the country variable to be Country by using the rename() function , and we will make the Year varaible numeric using the mutate() function.

Now let’s see how this data has changed:

# A tibble: 6 x 4
  Country      Year   GDP Label                
  <chr>       <dbl> <dbl> <chr>                
1 Afghanistan  1801    NA GDP Growth/Capita (%)
2 Afghanistan  1802    NA GDP Growth/Capita (%)
3 Afghanistan  1803    NA GDP Growth/Capita (%)
4 Afghanistan  1804    NA GDP Growth/Capita (%)
5 Afghanistan  1805    NA GDP Growth/Capita (%)
6 Afghanistan  1806    NA GDP Growth/Capita (%)
# A tibble: 219 x 2
    Year     n
   <dbl> <int>
 1  1801   194
 2  1802   194
 3  1803   194
 4  1804   194
 5  1805   194
 6  1806   194
 7  1807   194
 8  1808   194
 9  1809   194
10  1810   194
# … with 209 more rows

Again let’s check that the Country variable only contains values we would expect.

# A tibble: 194 x 1
   Country            
   <chr>              
 1 Afghanistan        
 2 Albania            
 3 Algeria            
 4 Andorra            
 5 Angola             
 6 Antigua and Barbuda
 7 Argentina          
 8 Armenia            
 9 Australia          
10 Austria            
# … with 184 more rows

Also looks good!

Energy Use per Person

Now let’s take a look at the energy use per person data:

# A tibble: 6 x 57
  country `1960` `1961` `1962` `1963` `1964` `1965` `1966` `1967` `1968` `1969`
  <chr>    <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>
1 Albania     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA
2 Algeria     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA
3 Angola      NA     NA     NA     NA     NA     NA     NA     NA     NA     NA
4 Antigu…     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA
5 Argent…     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA
6 Armenia     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA
# … with 46 more variables: `1970` <dbl>, `1971` <dbl>, `1972` <dbl>,
#   `1973` <dbl>, `1974` <dbl>, `1975` <dbl>, `1976` <dbl>, `1977` <dbl>,
#   `1978` <dbl>, `1979` <dbl>, `1980` <dbl>, `1981` <dbl>, `1982` <dbl>,
#   `1983` <dbl>, `1984` <dbl>, `1985` <dbl>, `1986` <dbl>, `1987` <dbl>,
#   `1988` <dbl>, `1989` <dbl>, `1990` <dbl>, `1991` <dbl>, `1992` <dbl>,
#   `1993` <dbl>, `1994` <dbl>, `1995` <dbl>, `1996` <dbl>, `1997` <dbl>,
#   `1998` <dbl>, `1999` <dbl>, `2000` <dbl>, `2001` <dbl>, `2002` <dbl>,
#   `2003` <dbl>, `2004` <dbl>, `2005` <dbl>, `2006` <dbl>, `2007` <dbl>,
#   `2008` <dbl>, `2009` <dbl>, `2010` <dbl>, `2011` <dbl>, `2012` <dbl>,
#   `2013` <dbl>, `2014` <dbl>, `2015` <dbl>

Rows: 169
Columns: 57
$ country <chr> "Albania", "Algeria", "Angola", "Antigua and Barbuda", "Argen…
$ `1960`  <dbl> NA, NA, NA, NA, NA, NA, 3060, 1550, NA, NA, NA, NA, NA, NA, 2…
$ `1961`  <dbl> NA, NA, NA, NA, NA, NA, 3120, 1550, NA, NA, NA, NA, NA, NA, 2…
$ `1962`  <dbl> NA, NA, NA, NA, NA, NA, 3170, 1680, NA, NA, NA, NA, NA, NA, 2…
$ `1963`  <dbl> NA, NA, NA, NA, NA, NA, 3280, 1820, NA, NA, NA, NA, NA, NA, 3…
$ `1964`  <dbl> NA, NA, NA, NA, NA, NA, 3350, 1860, NA, NA, NA, NA, NA, NA, 3…
$ `1965`  <dbl> NA, NA, NA, NA, NA, NA, 3460, 1850, NA, NA, NA, NA, NA, NA, 3…
$ `1966`  <dbl> NA, NA, NA, NA, NA, NA, 3550, 1900, NA, NA, NA, NA, NA, NA, 3…
$ `1967`  <dbl> NA, NA, NA, NA, NA, NA, 3690, 1920, NA, NA, NA, NA, NA, NA, 3…
$ `1968`  <dbl> NA, NA, NA, NA, NA, NA, 3760, 2050, NA, NA, NA, NA, NA, NA, 3…
$ `1969`  <dbl> NA, NA, NA, NA, NA, NA, 3790, 2180, NA, NA, NA, NA, NA, NA, 3…
$ `1970`  <dbl> NA, NA, NA, NA, NA, NA, 4060, 2420, NA, NA, NA, NA, NA, NA, 4…
$ `1971`  <dbl> 785.0, 232.0, 556.0, NA, 1380.0, NA, 3990.0, 2510.0, NA, NA, …
$ `1972`  <dbl> 866.0, 261.0, 584.0, NA, 1380.0, NA, 4040.0, 2630.0, NA, NA, …
$ `1973`  <dbl> 763.0, 305.0, 568.0, NA, 1410.0, NA, 4260.0, 2830.0, NA, NA, …
$ `1974`  <dbl> 777.0, 319.0, 565.0, NA, 1420.0, NA, 4290.0, 2730.0, NA, NA, …
$ `1975`  <dbl> 827.0, 330.0, 536.0, NA, 1380.0, NA, 4350.0, 2650.0, NA, NA, …
$ `1976`  <dbl> 891, 367, 515, NA, 1400, NA, 4410, 2870, NA, NA, 9580, 98, NA…
$ `1977`  <dbl> 924.0, 399.0, 494.0, NA, 1420.0, NA, 4670.0, 2800.0, NA, NA, …
$ `1978`  <dbl> 1010.0, 477.0, 527.0, NA, 1430.0, NA, 4630.0, 2890.0, NA, NA,…
$ `1979`  <dbl> 864.0, 586.0, 518.0, NA, 1480.0, NA, 4680.0, 3140.0, NA, NA, …
$ `1980`  <dbl> 1150, 579, 511, NA, 1490, NA, 4740, 3070, NA, NA, 7790, 103, …
$ `1981`  <dbl> 989, 611, 497, NA, 1430, NA, 4690, 2900, NA, NA, 8300, 102, N…
$ `1982`  <dbl> 967, 771, 473, NA, 1420, NA, 4820, 2830, NA, NA, 9070, 105, N…
$ `1983`  <dbl> 1000, 808, 469, NA, 1420, NA, 4560, 2840, NA, NA, 8500, 105, …
$ `1984`  <dbl> 1020, 776, 458, NA, 1450, NA, 4650, 2950, NA, NA, 8830, 104, …
$ `1985`  <dbl> 917, 786, 470, NA, 1360, NA, 4600, 3050, NA, NA, 9920, 107, N…
$ `1986`  <dbl> 964, 862, 462, NA, 1420, NA, 4620, 3060, NA, NA, 10300, 111, …
$ `1987`  <dbl> 922, 828, 461, NA, 1480, NA, 4770, 3170, NA, NA, 9520, 107, N…
$ `1988`  <dbl> 928, 850, 467, NA, 1500, NA, 4700, 3200, NA, NA, 10500, 114, …
$ `1989`  <dbl> 896, 820, 465, NA, 1440, NA, 5000, 3140, NA, NA, 10200, 117, …
$ `1990`  <dbl> 813, 856, 483, 1480, 1410, 2180, 5060, 3240, 3170, 2520, 1060…
$ `1991`  <dbl> 573, 884, 480, NA, 1430, 2320, 4930, 3420, 3090, NA, 10100, 1…
$ `1992`  <dbl> 418, 884, 467, NA, 1480, 1200, 4960, 3250, 2460, NA, 10800, 1…
$ `1993`  <dbl> 412, 868, 468, NA, 1470, 652, 5150, 3260, 2180, NA, 11100, 12…
$ `1994`  <dbl> 441, 819, 459, NA, 1540, 420, 5090, 3230, 1950, NA, 11600, 12…
$ `1995`  <dbl> 417, 839, 445, NA, 1540, 511, 5130, 3370, 1810, NA, 11400, 13…
$ `1996`  <dbl> 448, 798, 445, NA, 1580, 562, 5390, 3580, 1510, NA, 11100, 13…
$ `1997`  <dbl> 385, 805, 443, NA, 1610, 594, 5470, 3550, 1440, NA, 12200, 13…
$ `1998`  <dbl> 427, 821, 430, NA, 1650, 610, 5550, 3610, 1490, NA, 12400, 13…
$ `1999`  <dbl> 576, 864, 439, NA, 1660, 594, 5610, 3590, 1370, NA, 11900, 13…
$ `2000`  <dbl> 580, 866, 437, NA, 1660, 656, 5640, 3570, 1400, NA, 12000, 13…
$ `2001`  <dbl> 597, 856, 442, NA, 1560, 657, 5450, 3760, 1410, NA, 11700, 14…
$ `2002`  <dbl> 660, 904, 447, NA, 1500, 618, 5570, 3770, 1410, NA, 11500, 15…
$ `2003`  <dbl> 648, 949, 466, NA, 1590, 657, 5570, 3970, 1480, NA, 11600, 15…
$ `2004`  <dbl> 715, 948, 462, 1530, 1720, 698, 5600, 4010, 1540, 2060, 10900…
$ `2005`  <dbl> 720, 974, 431, 1530, 1710, 843, 5560, 4090, 1600, 2110, 11700…
$ `2006`  <dbl> 707, 1030, 456, 1580, 1840, 865, 5710, 4080, 1560, 2100, 1160…
$ `2007`  <dbl> 680, 1070, 470, 1600, 1850, 973, 5870, 4020, 1410, 2070, 1120…
$ `2008`  <dbl> 711, 1070, 491, NA, 1920, 1030, 5960, 4030, 1520, NA, 11300, …
$ `2009`  <dbl> 732, 1150, 514, NA, 1850, 904, 5860, 3800, 1330, NA, 10300, 1…
$ `2010`  <dbl> 729, 1110, 521, NA, 1910, 863, 5790, 4050, 1280, NA, 10200, 2…
$ `2011`  <dbl> 765, 1140, 522, NA, 1930, 944, 5750, 3920, 1370, NA, 9910, 20…
$ `2012`  <dbl> 688, 1220, 553, NA, 1920, 1030, 5570, 3890, 1470, NA, 9660, 2…
$ `2013`  <dbl> 801, 1240, 534, NA, 1950, 1000, 5460, 3920, 1470, NA, 10400, …
$ `2014`  <dbl> 808, 1320, 545, NA, 2020, 1020, 5330, 3760, 1500, NA, 10600, …
$ `2015`  <dbl> NA, NA, NA, NA, NA, NA, 5480, 3800, NA, NA, NA, NA, NA, NA, 4…

To wrangle the energy_use data, we will again convert the data to long format, rename some variables, and mutate the Year data to be numeric.

# A tibble: 10 x 4
   Country              Year Energy Label                          
   <chr>               <dbl>  <dbl> <chr>                          
 1 Algeria              2011   1140 Energy Use (kg, oil-eq./capita)
 2 South Sudan          1995     NA Energy Use (kg, oil-eq./capita)
 3 Guatemala            1987    443 Energy Use (kg, oil-eq./capita)
 4 Congo, Dem. Rep.     1988    338 Energy Use (kg, oil-eq./capita)
 5 Venezuela            1984   2150 Energy Use (kg, oil-eq./capita)
 6 St. Kitts and Nevis  1960     NA Energy Use (kg, oil-eq./capita)
 7 Algeria              1982    771 Energy Use (kg, oil-eq./capita)
 8 Cameroon             1964     NA Energy Use (kg, oil-eq./capita)
 9 Cameroon             2015     NA Energy Use (kg, oil-eq./capita)
10 Iraq                 1992   1280 Energy Use (kg, oil-eq./capita)

Now we will check the Country variable:

# A tibble: 169 x 1
   Country            
   <chr>              
 1 Albania            
 2 Algeria            
 3 Angola             
 4 Antigua and Barbuda
 5 Argentina          
 6 Armenia            
 7 Australia          
 8 Austria            
 9 Azerbaijan         
10 Bahamas            
# … with 159 more rows

Looks good!

Crude Mortality Rate

# A tibble: 6 x 64
  `Data Source` `World Developm… ...3  ...4  ...5  ...6  ...7  ...8  ...9  ...10
  <chr>         <chr>            <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
1 Last Updated… 43819            <NA>  <NA>  <NA>  <NA>  <NA>  <NA>  <NA>  <NA> 
2 <NA>          <NA>             <NA>  <NA>  <NA>  <NA>  <NA>  <NA>  <NA>  <NA> 
3 Country Name  Country Code     Indi… Indi… 1960  1961  1962  1963  1964  1965 
4 Aruba         ABW              Deat… SP.D… 6.38… 6.24… 6.11… 6.01… 5.91… 5.83…
5 Afghanistan   AFG              Deat… SP.D… 32.2… 31.6… 31.0… 30.5… 30.0… 29.5…
6 Angola        AGO              Deat… SP.D… 27.0… 26.8… 26.6… 26.4… 26.1… 25.9…
# … with 54 more variables: ...11 <chr>, ...12 <chr>, ...13 <chr>, ...14 <chr>,
#   ...15 <chr>, ...16 <chr>, ...17 <chr>, ...18 <chr>, ...19 <chr>,
#   ...20 <chr>, ...21 <chr>, ...22 <chr>, ...23 <chr>, ...24 <chr>,
#   ...25 <chr>, ...26 <chr>, ...27 <chr>, ...28 <chr>, ...29 <chr>,
#   ...30 <chr>, ...31 <chr>, ...32 <chr>, ...33 <chr>, ...34 <chr>,
#   ...35 <chr>, ...36 <chr>, ...37 <chr>, ...38 <chr>, ...39 <chr>,
#   ...40 <chr>, ...41 <chr>, ...42 <chr>, ...43 <chr>, ...44 <chr>,
#   ...45 <chr>, ...46 <chr>, ...47 <chr>, ...48 <chr>, ...49 <chr>,
#   ...50 <chr>, ...51 <chr>, ...52 <chr>, ...53 <chr>, ...54 <chr>,
#   ...55 <chr>, ...56 <chr>, ...57 <chr>, ...58 <chr>, ...59 <chr>,
#   ...60 <chr>, ...61 <chr>, ...62 <chr>, ...63 <chr>, ...64 <chr>

We can see that there are a couple of empty rows which indicate when the data was updated. We can also see that the columns really start at the 3rd row. So first we will repace the column names with the 3rd row. Then we will remove the first 3 rows.

 [1] "Data Source"                  "World Development Indicators"
 [3] "...3"                         "...4"                        
 [5] "...5"                         "...6"                        
 [7] "...7"                         "...8"                        
 [9] "...9"                         "...10"                       
[11] "...11"                        "...12"                       
[13] "...13"                        "...14"                       
[15] "...15"                        "...16"                       
[17] "...17"                        "...18"                       
[19] "...19"                        "...20"                       
[21] "...21"                        "...22"                       
[23] "...23"                        "...24"                       
[25] "...25"                        "...26"                       
[27] "...27"                        "...28"                       
[29] "...29"                        "...30"                       
[31] "...31"                        "...32"                       
[33] "...33"                        "...34"                       
[35] "...35"                        "...36"                       
[37] "...37"                        "...38"                       
[39] "...39"                        "...40"                       
[41] "...41"                        "...42"                       
[43] "...43"                        "...44"                       
[45] "...45"                        "...46"                       
[47] "...47"                        "...48"                       
[49] "...49"                        "...50"                       
[51] "...51"                        "...52"                       
[53] "...53"                        "...54"                       
[55] "...55"                        "...56"                       
[57] "...57"                        "...58"                       
[59] "...59"                        "...60"                       
[61] "...61"                        "...62"                       
[63] "...63"                        "...64"                       
 [1] "Country Name"   "Country Code"   "Indicator Name" "Indicator Code"
 [5] "1960"           "1961"           "1962"           "1963"          
 [9] "1964"           "1965"           "1966"           "1967"          
[13] "1968"           "1969"           "1970"           "1971"          
[17] "1972"           "1973"           "1974"           "1975"          
[21] "1976"           "1977"           "1978"           "1979"          
[25] "1980"           "1981"           "1982"           "1983"          
[29] "1984"           "1985"           "1986"           "1987"          
[33] "1988"           "1989"           "1990"           "1991"          
[37] "1992"           "1993"           "1994"           "1995"          
[41] "1996"           "1997"           "1998"           "1999"          
[45] "2000"           "2001"           "2002"           "2003"          
[49] "2004"           "2005"           "2006"           "2007"          
[53] "2008"           "2009"           "2010"           "2011"          
[57] "2012"           "2013"           "2014"           "2015"          
[61] "2016"           "2017"           "2018"           "2019"          

Rows: 264
Columns: 64
$ `Country Name`   <chr> "Aruba", "Afghanistan", "Angola", "Albania", "Andorr…
$ `Country Code`   <chr> "ABW", "AFG", "AGO", "ALB", "AND", "ARB", "ARE", "AR…
$ `Indicator Name` <chr> "Death rate, crude (per 1,000 people)", "Death rate,…
$ `Indicator Code` <chr> "SP.DYN.CDRT.IN", "SP.DYN.CDRT.IN", "SP.DYN.CDRT.IN"…
$ `1960`           <chr> "6.3879999999999999", "32.219000000000001", "27.0970…
$ `1961`           <chr> "6.2409999999999997", "31.649000000000001", "26.8590…
$ `1962`           <chr> "6.1180000000000003", "31.093", "26.626999999999999"…
$ `1963`           <chr> "6.0119999999999996", "30.550999999999998", "26.407"…
$ `1964`           <chr> "5.9199999999999999", "30.021999999999998", "26.1939…
$ `1965`           <chr> "5.8390000000000004", "29.501000000000001", "25.9660…
$ `1966`           <chr> "5.7699999999999996", "28.984999999999999", "25.6900…
$ `1967`           <chr> "5.7160000000000002", "28.468", "25.341999999999999"…
$ `1968`           <chr> "5.6820000000000004", "27.946000000000002", "24.916"…
$ `1969`           <chr> "5.6660000000000004", "27.417999999999999", "24.4179…
$ `1970`           <chr> "5.6710000000000003", "26.879999999999999", "23.872"…
$ `1971`           <chr> "5.6980000000000004", "26.334", "23.312000000000001"…
$ `1972`           <chr> "5.7460000000000004", "25.780999999999999", "22.7770…
$ `1973`           <chr> "5.8120000000000003", "25.222000000000001", "22.2959…
$ `1974`           <chr> "5.8929999999999998", "24.658000000000001", "21.8850…
$ `1975`           <chr> "5.9809999999999999", "24.087", "21.547999999999998"…
$ `1976`           <chr> "6.0700000000000003", "23.507999999999999", "21.276"…
$ `1977`           <chr> "6.157", "22.920000000000002", "21.047000000000001",…
$ `1978`           <chr> "6.2359999999999998", "22.324000000000002", "20.8389…
$ `1979`           <chr> "6.3079999999999998", "21.719999999999999", "20.6469…
$ `1980`           <chr> "6.3760000000000003", "21.109000000000002", "20.4669…
$ `1981`           <chr> "6.444", "20.489999999999998", "20.297999999999998",…
$ `1982`           <chr> "6.5190000000000001", "19.864999999999998", "20.145"…
$ `1983`           <chr> "6.6020000000000003", "19.239999999999998", "20.009"…
$ `1984`           <chr> "6.6929999999999996", "18.617999999999999", "19.8889…
$ `1985`           <chr> "6.7850000000000001", "18.004999999999999", "19.7890…
$ `1986`           <chr> "6.8730000000000002", "17.405999999999999", "19.7100…
$ `1987`           <chr> "6.9480000000000004", "16.826000000000001", "19.651"…
$ `1988`           <chr> "7.0049999999999999", "16.268000000000001", "19.6099…
$ `1989`           <chr> "7.0430000000000001", "15.738", "19.579000000000001"…
$ `1990`           <chr> "7.0590000000000002", "15.241", "19.555", "5.9850000…
$ `1991`           <chr> "7.0540000000000003", "14.782999999999999", "19.5330…
$ `1992`           <chr> "7.0339999999999998", "14.362", "19.506", "6.1550000…
$ `1993`           <chr> "7.0049999999999999", "13.974", "19.463999999999999"…
$ `1994`           <chr> "6.9729999999999999", "13.616", "19.396000000000001"…
$ `1995`           <chr> "6.9429999999999996", "13.282", "19.292000000000002"…
$ `1996`           <chr> "6.9219999999999997", "12.964", "19.146000000000001"…
$ `1997`           <chr> "6.9109999999999996", "12.654999999999999", "18.9520…
$ `1998`           <chr> "6.915", "12.348000000000001", "18.706", "6.06700000…
$ `1999`           <chr> "6.9340000000000002", "12.037000000000001", "18.404"…
$ `2000`           <chr> "6.9710000000000001", "11.718", "18.036000000000001"…
$ `2001`           <chr> "7.0220000000000002", "11.387", "17.597000000000001"…
$ `2002`           <chr> "7.0839999999999996", "11.048", "17.09", "5.891", NA…
$ `2003`           <chr> "7.1539999999999999", "10.704000000000001", "16.5219…
$ `2004`           <chr> "7.2329999999999997", "10.356", "15.903", "6.0609999…
$ `2005`           <chr> "7.3200000000000003", "10.003", "15.24", "6.20600000…
$ `2006`           <chr> "7.4180000000000001", "9.6449999999999996", "14.539"…
$ `2007`           <chr> "7.5270000000000001", "9.2870000000000008", "13.815"…
$ `2008`           <chr> "7.6479999999999997", "8.9320000000000004", "13.0850…
$ `2009`           <chr> "7.7800000000000002", "8.5839999999999996", "12.3670…
$ `2010`           <chr> "7.9180000000000001", "8.25", "11.68", "6.8410000000…
$ `2011`           <chr> "8.0609999999999999", "7.9359999999999999", "11.039"…
$ `2012`           <chr> "8.2050000000000001", "7.6449999999999996", "10.4510…
$ `2013`           <chr> "8.3469999999999995", "7.3799999999999999", "9.92099…
$ `2014`           <chr> "8.4879999999999995", "7.141", "9.4540000000000006",…
$ `2015`           <chr> "8.6270000000000007", "6.9290000000000003", "9.05199…
$ `2016`           <chr> "8.7650000000000006", "6.742", "8.7159999999999993",…
$ `2017`           <chr> "8.907", "6.5750000000000002", "8.4320000000000004",…
$ `2018`           <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, …
$ `2019`           <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, …

That is looking better! However, we also want to remove some variables like: Country Code, Indicator Name, and Indicator Code. We can do that using the select() functio of the dplyr package. We can use the minus sign - to indicate what variables we dont want to keep. Otherwise, we will perform similar modifications as we performed on the other datasets. Note that these variable names need quotation marks around them because they have spaces.

# A tibble: 6 x 4
  Country  Year Deaths Label             
  <chr>   <dbl>  <dbl> <chr>             
1 Aruba    1960   6.39 Deaths/1000 People
2 Aruba    1961   6.24 Deaths/1000 People
3 Aruba    1962   6.12 Deaths/1000 People
4 Aruba    1963   6.01 Deaths/1000 People
5 Aruba    1964   5.92 Deaths/1000 People
6 Aruba    1965   5.84 Deaths/1000 People

Let’s check the Country variable:

# A tibble: 264 x 1
   Country             
   <chr>               
 1 Aruba               
 2 Afghanistan         
 3 Angola              
 4 Albania             
 5 Andorra             
 6 Arab World          
 7 United Arab Emirates
 8 Argentina           
 9 Armenia             
10 American Samoa      
# … with 254 more rows

Ok, in this case it looks like there are some regions included as well, like:

“East Asia & Pacific (excluding high income)”, “Early-demographic dividend”, “East Asia & Pacific”, “Europe & Central Asia (excluding high income)”, “Europe & Central Asia”, “Euro area”, “Fragile and conflict affected situations”, “European Union”, “Heavily indebted poor countries (HIPC)”, “IBRD only”, “IDA & IBRD total”, “IDA total”, “IDA blend”, “IDA only”, “Not classified”, “Latin America & Caribbean (excluding high income)”, “Latin America & Caribbean”, “Least developed countries: UN classification”,“Low income”," Lower middle income“,”Low & middle income“,”Late-demographic dividend“,”Middle East & North Africa“,”Middle income“,”Middle East & North Africa (excluding high income)“,”North America“,”OECD members“,”Other small states“,”Pre-demographic dividend“,”West Bank and Gaza“,”Pacific island small states“,”Post-demographic dividend“,”French Polynesia“,”South Asia“,”Sub-Saharan Africa (excluding high income)“,”Sub-Saharan Africa“,”East Asia & Pacific (IDA & IBRD countries)“,”Europe & Central Asia (IDA & IBRD countries)“,”Latin America & the Caribbean (IDA & IBRD countries)“,”Middle East & North Africa (IDA & IBRD countries)“,”South Asia (IDA & IBRD)“,”Sub-Saharan Africa (IDA & IBRD countries)“,”Upper middle income".

Let’s remove these regions:

US Specific Data

Now we will take a look at the US data about disasters and temperature.

Disasters

# A tibble: 40 x 57
    Year `Drought Count` `Drought Cost` `Drought Lower … `Drought Upper …
   <dbl>           <dbl>          <dbl>            <dbl>            <dbl>
 1  1980               1           33.2             26.4             39.6
 2  1981               0            0                0                0  
 3  1982               0            0                0                0  
 4  1983               1            7.8              5.5              9  
 5  1984               0            0                0                0  
 6  1985               0            0                0                0  
 7  1986               1            4.2              3.5              5  
 8  1987               0            0                0                0  
 9  1988               1           44.4             33.8             54  
10  1989               1            6.4              5.6              7.4
# … with 30 more rows, and 52 more variables: `Drought Lower 90` <dbl>,
#   `Drought Upper 90` <dbl>, `Drought Lower 95` <dbl>, `Drought Upper
#   95` <dbl>, `Flooding Count` <dbl>, `Flooding Cost` <dbl>, `Flooding Lower
#   75` <dbl>, `Flooding Upper 75` <dbl>, `Flooding Lower 90` <dbl>, `Flooding
#   Upper 90` <dbl>, `Flooding Lower 95` <dbl>, `Flooding Upper 95` <dbl>,
#   `Freeze Count` <dbl>, `Freeze Cost` <dbl>, `Freeze Lower 75` <dbl>, `Freeze
#   Upper 75` <dbl>, `Freeze Lower 90` <dbl>, `Freeze Upper 90` <dbl>, `Freeze
#   Lower 95` <dbl>, `Freeze Upper 95` <dbl>, `Severe Storm Count` <dbl>,
#   `Severe Storm Cost` <dbl>, `Severe Storm Lower 75` <dbl>, `Severe Storm
#   Upper 75` <dbl>, `Severe Storm Lower 90` <dbl>, `Severe Storm Upper
#   90` <dbl>, `Severe Storm Lower 95` <dbl>, `Severe Storm Upper 95` <dbl>,
#   `Tropical Cyclone Count` <dbl>, `Tropical Cyclone Cost` <dbl>, `Tropical
#   Cyclone Lower 75` <dbl>, `Tropical Cyclone Upper 75` <dbl>, `Tropical
#   Cyclone Lower 90` <dbl>, `Tropical Cyclone Upper 90` <dbl>, `Tropical
#   Cyclone Lower 95` <dbl>, `Tropical Cyclone Upper 95` <dbl>, `Wildfire
#   Count` <dbl>, `Wildfire Cost` <dbl>, `Wildfire Lower 75` <dbl>, `Wildfire
#   Upper 75` <dbl>, `Wildfire Lower 90` <dbl>, `Wildfire Upper 90` <dbl>,
#   `Wildfire Lower 95` <dbl>, `Wildfire Upper 95` <dbl>, `Winter Storm
#   Count` <dbl>, `Winter Storm Cost` <dbl>, `Winter Storm Lower 75` <dbl>,
#   `Winter Storm Upper 75` <dbl>, `Winter Storm Lower 90` <dbl>, `Winter Storm
#   Upper 90` <dbl>, `Winter Storm Lower 95` <dbl>, `Winter Storm Upper
#   95` <dbl>

We are specifically interested in the Year and the variables that contain the word "Count" so we will select them using the select() and contains() functions in the dplyr package. Since we are selecting for variables with the word "Count" we need to use quotation marks around it. Selecting for the variable year does not require this as that is actually the name of one of the existing variables.

# A tibble: 6 x 8
   Year `Drought Count` `Flooding Count` `Freeze Count` `Severe Storm C…
  <dbl>           <dbl>            <dbl>          <dbl>            <dbl>
1  1980               1                1              0                0
2  1981               0                0              1                1
3  1982               0                0              0                2
4  1983               1                2              1                0
5  1984               0                0              0                2
6  1985               0                0              1                0
# … with 3 more variables: `Tropical Cyclone Count` <dbl>, `Wildfire
#   Count` <dbl>, `Winter Storm Count` <dbl>

Now we want to create a new variable that will be the sum of all the different types of disasters for each year.

We can create this ne variable using the mutate() function of dplyr and we will use the base rowSums() function to perform the calculation. We dont want to include the Year variable in our sum, so we can exclude it using the selectfunction within the rowSums() function. However, to do so we need to indicate that we are using the data that we already used as input to our mutate() and rowSums() functions. We can do so by using a ..

Rows: 40
Columns: 9
$ Year                     <dbl> 1980, 1981, 1982, 1983, 1984, 1985, 1986, 19…
$ `Drought Count`          <dbl> 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0,…
$ `Flooding Count`         <dbl> 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1,…
$ `Freeze Count`           <dbl> 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0,…
$ `Severe Storm Count`     <dbl> 0, 1, 2, 0, 2, 0, 1, 0, 0, 1, 1, 1, 4, 1, 1,…
$ `Tropical Cyclone Count` <dbl> 1, 0, 0, 1, 0, 3, 0, 0, 0, 1, 0, 1, 2, 0, 1,…
$ `Wildfire Count`         <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1,…
$ `Winter Storm Count`     <dbl> 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 2,…
$ Disasters                <dbl> 3, 2, 3, 5, 2, 5, 2, 0, 1, 5, 3, 4, 7, 5, 6,…

Great, now we are going to remove some of these variables and just keep or select using the select() function the variables we are interested in. We will keep the Flooding Count becuase as you may recall from earlier in this case study, events of extreme perciptation levels appear to be associated with global warming. We will use this as a proxy for that.

We are also going to add a new variable called Country to indicate that this data is from the United States. This will create a new variable where every value is United States.

# A tibble: 6 x 5
   Year Country       Indicator Value Label              
  <dbl> <chr>         <chr>     <dbl> <chr>              
1  1980 United States Disasters     3 Number of Disasters
2  1981 United States Disasters     2 Number of Disasters
3  1982 United States Disasters     3 Number of Disasters
4  1983 United States Disasters     5 Number of Disasters
5  1984 United States Disasters     2 Number of Disasters
6  1985 United States Disasters     5 Number of Disasters

Temperature

# A tibble: 6 x 3
    Date Value Anomaly
   <dbl> <dbl>   <dbl>
1 189512  50.3   -1.68
2 189612  52.0   -0.03
3 189712  51.6   -0.46
4 189812  51.4   -0.59
5 189912  51.0   -1.01
6 190012  52.8    0.75

OK, so we want to remove the Anomaly variable which is an indicator of how different the national average temperature for that year was from the average temperature from 1901-2000 which was 52.02°F.

We also want to change the date values, which are currently listed as the year followed by the number 12. To do so we want to just keep the first 4 characters in the Date variable string values. We can use the str_sub() function of the stringr package to do this. We just need to indicate the start and stop characters. In this case the start would be 1 and the 4th character would be where we want to stop, so we would use start = 1, stop = 4. Again we will create a Country variable. We will also change the name of the Date variable to Year so that it will be consistent with our other datasets. Furthermore, we also what it to be numeric. We can accomplish both renaming and changing to numeric by using the mutate() function. We canthen remove the Date variable and also order the columns just like the other us data using the select() function.

# A tibble: 6 x 5
   Year Country       Indicator   Value Label                   
  <dbl> <chr>         <chr>       <dbl> <chr>                   
1  1895 United States Temperature  50.3 Temperature (Fahrenheit)
2  1896 United States Temperature  52.0 Temperature (Fahrenheit)
3  1897 United States Temperature  51.6 Temperature (Fahrenheit)
4  1898 United States Temperature  51.4 Temperature (Fahrenheit)
5  1899 United States Temperature  51.0 Temperature (Fahrenheit)
6  1900 United States Temperature  52.8 Temperature (Fahrenheit)

Joining data

Now we would like to join the different datasets together into one tibble. To do so it is often necessary to have at least one column or variable with the same name to be used as a key for putting your data together. To put all of our data together there are several *_join() functions available in the dplyr package.

We will use the full_join() function as we have different time spans for each dataset and we would like to retain as much data as possible. Thefull_join() function will simply create NA values for any of the years that are not in one of the data sets. We can check by using the base summary() function. This will also allow us to check that there are column names that are consistent in each dataset that we wish to combine.

   Country               Year        Emissions           Label          
 Length:50688       Min.   :1751   Min.   :       0   Length:50688      
 Class :character   1st Qu.:1817   1st Qu.:     550   Class :character  
 Mode  :character   Median :1882   Median :    4390   Mode  :character  
                    Mean   :1882   Mean   :   83808                     
                    3rd Qu.:1948   3rd Qu.:   31925                     
                    Max.   :2014   Max.   :10300000                     
                                   NA's   :33772                        
   Country               Year           GDP             Label          
 Length:42486       Min.   :1801   Min.   :-67.500   Length:42486      
 Class :character   1st Qu.:1855   1st Qu.:  0.133   Class :character  
 Mode  :character   Median :1910   Median :  0.633   Mode  :character  
                    Mean   :1910   Mean   :  1.302                     
                    3rd Qu.:1965   3rd Qu.:  2.160                     
                    Max.   :2019   Max.   :145.000                     
                                   NA's   :2392                        
   Country               Year          Energy            Label          
 Length:9464        Min.   :1960   Min.   :    9.58   Length:9464       
 Class :character   1st Qu.:1974   1st Qu.:  505.75   Class :character  
 Mode  :character   Median :1988   Median : 1185.00   Mode  :character  
                    Mean   :1988   Mean   : 2238.82                     
                    3rd Qu.:2001   3rd Qu.: 3030.00                     
                    Max.   :2015   Max.   :22000.00                     
                                   NA's   :3544                         
   Country               Year          Deaths          Label          
 Length:13320       Min.   :1960   Min.   : 1.127   Length:13320      
 Class :character   1st Qu.:1975   1st Qu.: 6.950   Class :character  
 Mode  :character   Median :1990   Median : 9.217   Mode  :character  
                    Mean   :1990   Mean   :10.596                     
                    3rd Qu.:2004   3rd Qu.:12.630                     
                    Max.   :2019   Max.   :54.444                     
                                   NA's   :1431                       

Indeed, Country, and Year variables are present in all of the datasets. We can see that the minimum and maximum year is different for nearly all the datasets.

We need to specify what columns/variables we will be joining by using the by = argument in the full_join() function.

# A tibble: 6 x 7
  Country      Year Emissions Label                          GDP Energy Deaths
  <chr>       <dbl>     <dbl> <chr>                        <dbl>  <dbl>  <dbl>
1 Norway       1843      62.3 CO2 Emissions (Metric Tons) NA         NA     NA
2 Botswana     1836      NA   GDP Growth/Capita (%)        0.469     NA     NA
3 Algeria      2008  110000   CO2 Emissions (Metric Tons) NA         NA     NA
4 Togo         1951      25.7 CO2 Emissions (Metric Tons) NA         NA     NA
5 Denmark      1875      NA   GDP Growth/Capita (%)        0.863     NA     NA
6 Philippines  1938      NA   GDP Growth/Capita (%)        0.876     NA     NA

We can also do the same thing using by using thereduce() function of the purrr package. This is a good option if you have many dasasets to combine.

# A tibble: 6 x 7
  Country      Year Emissions Label                         GDP Energy Deaths
  <chr>       <dbl>     <dbl> <chr>                       <dbl>  <dbl>  <dbl>
1 Afghanistan  1751        NA CO2 Emissions (Metric Tons)    NA     NA     NA
2 Afghanistan  1752        NA CO2 Emissions (Metric Tons)    NA     NA     NA
3 Afghanistan  1753        NA CO2 Emissions (Metric Tons)    NA     NA     NA
4 Afghanistan  1754        NA CO2 Emissions (Metric Tons)    NA     NA     NA
5 Afghanistan  1755        NA CO2 Emissions (Metric Tons)    NA     NA     NA
6 Afghanistan  1756        NA CO2 Emissions (Metric Tons)    NA     NA     NA
Rows: 115,958
Columns: 7
$ Country   <chr> "Afghanistan", "Afghanistan", "Afghanistan", "Afghanistan",…
$ Year      <dbl> 1751, 1752, 1753, 1754, 1755, 1756, 1757, 1758, 1759, 1760,…
$ Emissions <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
$ Label     <chr> "CO2 Emissions (Metric Tons)", "CO2 Emissions (Metric Tons)…
$ GDP       <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
$ Energy    <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
$ Deaths    <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…

Nice, looks good!

We will also make a long version of this data, where we will create an new variable called Indicator that will indicate what dataset the data came from and we will collapse the values from the columns called Emissions (CO2 Emissions (Mg)), GDP(GDP Growth/Capita (%)), Energy(Energy Use (kg, oil-eq./capita)), and Deaths (Deaths/1000 People).

# A tibble: 6 x 5
  Country          Year Label                           Indicator Value
  <chr>           <dbl> <chr>                           <chr>     <dbl>
1 Slovenia         1970 CO2 Emissions (Metric Tons)     GDP          NA
2 Kyrgyz Republic  1968 CO2 Emissions (Metric Tons)     GDP          NA
3 Timor-Leste      1962 Deaths/1000 People              GDP          NA
4 St. Lucia        1999 Energy Use (kg, oil-eq./capita) Emissions    NA
5 Poland           1816 CO2 Emissions (Metric Tons)     Emissions   678
6 China            1832 GDP Growth/Capita (%)           Energy       NA

We will now combine this data with the US data about disasters and temperatures.

We will now use the bind_rows() function which will just append the us_temperature data and the us_disaster data after the data_long data.

# A tibble: 6 x 5
   Year Country       Indicator Value Label              
  <dbl> <chr>         <chr>     <dbl> <chr>              
1  1980 United States Disasters     3 Number of Disasters
2  1981 United States Disasters     2 Number of Disasters
3  1982 United States Disasters     3 Number of Disasters
4  1983 United States Disasters     5 Number of Disasters
5  1984 United States Disasters     2 Number of Disasters
6  1985 United States Disasters     5 Number of Disasters
# A tibble: 6 x 5
   Year Country       Indicator   Value Label                   
  <dbl> <chr>         <chr>       <dbl> <chr>                   
1  1895 United States Temperature  50.3 Temperature (Fahrenheit)
2  1896 United States Temperature  52.0 Temperature (Fahrenheit)
3  1897 United States Temperature  51.6 Temperature (Fahrenheit)
4  1898 United States Temperature  51.4 Temperature (Fahrenheit)
5  1899 United States Temperature  51.0 Temperature (Fahrenheit)
6  1900 United States Temperature  52.8 Temperature (Fahrenheit)

We can check the top and bottom of the new data_long tibble to see that our us_temperature data is at the bottom. To see the end of our tibble we can use slice_tail() function of the dplyr package.

# A tibble: 6 x 5
  Country      Year Label                       Indicator Value
  <fct>       <dbl> <chr>                       <chr>     <dbl>
1 Afghanistan  1751 CO2 Emissions (Metric Tons) Emissions    NA
2 Afghanistan  1751 CO2 Emissions (Metric Tons) GDP          NA
3 Afghanistan  1751 CO2 Emissions (Metric Tons) Energy       NA
4 Afghanistan  1751 CO2 Emissions (Metric Tons) Deaths       NA
5 Afghanistan  1752 CO2 Emissions (Metric Tons) Emissions    NA
6 Afghanistan  1752 CO2 Emissions (Metric Tons) GDP          NA
# A tibble: 6 x 5
  Country        Year Label                    Indicator   Value
  <fct>         <dbl> <chr>                    <chr>       <dbl>
1 United States  2014 Temperature (Fahrenheit) Temperature  52.5
2 United States  2015 Temperature (Fahrenheit) Temperature  54.4
3 United States  2016 Temperature (Fahrenheit) Temperature  54.9
4 United States  2017 Temperature (Fahrenheit) Temperature  54.6
5 United States  2018 Temperature (Fahrenheit) Temperature  53.5
6 United States  2019 Temperature (Fahrenheit) Temperature  52.7
# A tibble: 10 x 5
   Country   Year Label                       Indicator Value
   <fct>    <dbl> <chr>                       <chr>     <dbl>
 1 Moldova   2004 CO2 Emissions (Metric Tons) GDP          NA
 2 Ukraine   1970 CO2 Emissions (Metric Tons) Energy       NA
 3 Romania   1853 CO2 Emissions (Metric Tons) Emissions    NA
 4 Algeria   1848 CO2 Emissions (Metric Tons) GDP          NA
 5 Vietnam   1973 GDP Growth/Capita (%)       Emissions    NA
 6 Ukraine   1981 GDP Growth/Capita (%)       Energy       NA
 7 Brazil    1894 GDP Growth/Capita (%)       GDP          NA
 8 Ethiopia  1951 GDP Growth/Capita (%)       Energy       NA
 9 Panama    1918 CO2 Emissions (Metric Tons) GDP          NA
10 Somalia   1956 GDP Growth/Capita (%)       Energy       NA

Click here for details about the difference between full_join() and bind_rows()

The difference between this function and the full_join() function is that the bind_rows() function will essentially just append each dataset to each other, whereas the full_join() function collapses data that is comparable. Here you will see an example of what the data would have been like for data_wide if we had made it using bind_rows() and if full_join() had been used but was not joined by the Label variable. Since the Label variable has unique values for each type of Indicator, this causes the full_join() result to be the same as bind_rows(). We will specifically look at the values for China in the year of 1980.

[1] 54726    10
[1] 115958      7
[1] TRUE
# A tibble: 1 x 10
  Country  Year Emissions Label.x   GDP Label.y Energy Label.x.x Deaths
  <chr>   <dbl>     <dbl> <chr>   <dbl> <chr>    <dbl> <chr>      <dbl>
1 China    1980   1470000 CO2 Em…  2.16 GDP Gr…    609 Energy U…   6.34
# … with 1 more variable: Label.y.y <chr>
# A tibble: 4 x 7
  Country  Year Emissions Label                             GDP Energy Deaths
  <chr>   <dbl>     <dbl> <chr>                           <dbl>  <dbl>  <dbl>
1 China    1980   1470000 CO2 Emissions (Metric Tons)     NA        NA  NA   
2 China    1980        NA GDP Growth/Capita (%)            2.16     NA  NA   
3 China    1980        NA Energy Use (kg, oil-eq./capita) NA       609  NA   
4 China    1980        NA Deaths/1000 People              NA        NA   6.34
# A tibble: 4 x 7
  Country  Year Emissions Label                             GDP Energy Deaths
  <chr>   <dbl>     <dbl> <chr>                           <dbl>  <dbl>  <dbl>
1 China    1980   1470000 CO2 Emissions (Metric Tons)     NA        NA  NA   
2 China    1980        NA GDP Growth/Capita (%)            2.16     NA  NA   
3 China    1980        NA Energy Use (kg, oil-eq./capita) NA       609  NA   
4 China    1980        NA Deaths/1000 People              NA        NA   6.34

We will also create a new variable called Region that will indicate if the data is about the United States or a different country based on the values in the Country variable. We will use the case_when() function of the dplyr package to do this. If the Country variable is equal to "United States" the value for the new variable will also be “United States”, where as if the Country variable is not equal to "United States" but is some other character string value, such as "Afghanistan", then the value for the new variable will be "Rest of the World". The new values for the new variable Region are indicated after the specific conditional statements by using the ~ symbol.

# A tibble: 6 x 6
  Country      Year Label                       Indicator Value Region          
  <fct>       <dbl> <chr>                       <chr>     <dbl> <chr>           
1 Afghanistan  1751 CO2 Emissions (Metric Tons) Emissions    NA Rest of the Wor…
2 Afghanistan  1751 CO2 Emissions (Metric Tons) GDP          NA Rest of the Wor…
3 Afghanistan  1751 CO2 Emissions (Metric Tons) Energy       NA Rest of the Wor…
4 Afghanistan  1751 CO2 Emissions (Metric Tons) Deaths       NA Rest of the Wor…
5 Afghanistan  1752 CO2 Emissions (Metric Tons) Emissions    NA Rest of the Wor…
6 Afghanistan  1752 CO2 Emissions (Metric Tons) GDP          NA Rest of the Wor…

To remove entries for countries with NA values we can use the drop_na() function of the tidyr package to drop all years with missing data.

You can see that by removing the NA values the data for Afghanistan starts at 1949 instead of 1751.

# A tibble: 6 x 6
  Country      Year Label                       Indicator Value Region          
  <fct>       <dbl> <chr>                       <chr>     <dbl> <chr>           
1 Afghanistan  1949 CO2 Emissions (Metric Tons) Emissions  14.7 Rest of the Wor…
2 Afghanistan  1950 CO2 Emissions (Metric Tons) Emissions  84.3 Rest of the Wor…
3 Afghanistan  1951 CO2 Emissions (Metric Tons) Emissions  91.7 Rest of the Wor…
4 Afghanistan  1952 CO2 Emissions (Metric Tons) Emissions  91.7 Rest of the Wor…
5 Afghanistan  1953 CO2 Emissions (Metric Tons) Emissions 106   Rest of the Wor…
6 Afghanistan  1954 CO2 Emissions (Metric Tons) Emissions 106   Rest of the Wor…

Data Exploration


Now we will create some simple plots to examine the data.

We can check the time span of this data by refering back to the What are the data? section. To make these plots we will use the ggplot2 package. The first step in creating a plot is to define what data we intend to use and what data will be ploted on the x-axis, the y-axis, and if any data will be used to determine the color or the fill (also color of plots that have something to fill like a bar plot) or group. All of these are defined using the aes() argument, which is short for aesthetic mappings.

First we will take a look at the CO2 emission data.

CO2 Emissions (1751-2014)

We first need to give the correct data input. We will filter our data to only include the CO2 emissions data by using the filter() function of the dplyr package. To use this function we need to specify what value we want for a given variable. In this case we want all rows where the Indicator variable is equal to the word Emissions. Notice that this needs to be in quotes, while the variable name does not.

Then we use the aes() argument of the ggplot() function to define that our x-axis will be the Year variable, the y-axis will be the emission Value variable, and that our data should be grouped or separted by the Country variable. If we were to stop there we would get a blank plot, as you can see below. We need to add another layer to define how we want the plot to look. We do so by using the + sign in between each command.

We will use the geom_line() function becuase we would like to create a line plot. There are many geom_* functions to choose from that create many different types of plots.

Type geom into the RStudio console and you will see many options to scroll through.

Since we have many overlapping lines, we will make our lines slightly transparent by using the alpha argument. This takes values from 0 to 1, where 0 is completely transparent and 1 is completely opague. We will also add labels using the labs() function. Again, notice that a plus sign is used between each layer that we add to the plot. To make CO2 appear with a subscript we can use ~CO[2]~. We will also use the function theme_linedraw() of ggplot2 to change the general apearance of the plot.

Type theme_ in the RStudio console to see the varios plot theme options available.

We will also use the theme() function to change the font size of the x-axis, y-axis, axis titles, and the caption as shown below. To know what to call each element of the plot in this function to change the size type ?theme() in the console. You will see a very large list that includes other plot aspects like the background and the legend. This function can be used to modify your plot to your specifications. We will also use it to remove the legend title by using element_blank(). In this case, we are also saving the plot to an object called co2plot. To show the plot we simply type the name of the object.

Great! We’ve created our first plot. We can see that many countries show a dramatic increase in emissions over time with a handful of countries with particularly high levels. What about the United States? Which line indicates the emissions in the US? We can add another layer on top of our first plot to add a red line just for the US data. To do this we need to indicate what data we would like to plot, so we need to filter for just the US data and then we need to indicate that it will be colored by Country, even though in this case we only have one line to color. The default color would be a salmon pink color, but we would like red. So we will use the scale_color_manual() function to manually choose the color that we want by using scale_colour_manual(values = c("red")). Notice how the color name needs to be in quotes and that the argument values = is used to specify what color values to use.

We can add this line to the plot in two ways. The first way is to add the code for this layer to the original code that we used to create the co2plot or the second way is to simply add to that plot object by using the +.

It looks like the US has long been the largest CO2 emission producing country until recently, when the US was surpassed by another country.

Let’s figure out which country, by seeing what the top 10 emission producing countries were in 2014. We can do so by filtering the data for 2014, which was the final year of the data. Then we can make a rank variable based on the Value variable for the amount of emissions produced. There are many functions in the dplyr package for ranking values that are based on the SQL rank functions. SQL is another programming language for managing large amounts of data. The difference in the rank functions mostly has to do with how to deal with ties in the data. We will use dense_rank(), as we do not want gaps between ranks.

We want to do this in descending order becuase we want to rank by largest to smallest, so we will use the desc() function of the dplyr package. Then we will arrange the output by rank using the arrange() function of the dplyr package.

# A tibble: 10 x 7
   Country       Year Label                Indicator   Value Region         rank
   <fct>        <dbl> <chr>                <chr>       <dbl> <chr>         <int>
 1 China         2014 CO2 Emissions (Metr… Emissions  1.03e7 Rest of the …     1
 2 United Stat…  2014 CO2 Emissions (Metr… Emissions  5.25e6 United States     2
 3 India         2014 CO2 Emissions (Metr… Emissions  2.24e6 Rest of the …     3
 4 Russia        2014 CO2 Emissions (Metr… Emissions  1.71e6 Rest of the …     4
 5 Japan         2014 CO2 Emissions (Metr… Emissions  1.21e6 Rest of the …     5
 6 Germany       2014 CO2 Emissions (Metr… Emissions  7.20e5 Rest of the …     6
 7 Iran          2014 CO2 Emissions (Metr… Emissions  6.49e5 Rest of the …     7
 8 Saudi Arabia  2014 CO2 Emissions (Metr… Emissions  6.01e5 Rest of the …     8
 9 South Korea   2014 CO2 Emissions (Metr… Emissions  5.87e5 Rest of the …     9
10 Canada        2014 CO2 Emissions (Metr… Emissions  5.37e5 Rest of the …    10

We can see that China is now the top emission producing country.

Let’s make a plot of these top countries. We need to filter the data to just these top countries by using the %in% opperator to only keep countries in ourCountry variable that are also in the Country variable within top_10_count. We can use the pull() function also fo the dplyr package to specifically grab just the Country data out of top_10_count.

Since we have 10 countries we will want to differentiate them by color.

To color our plot we will use the viridis color pallette which is compatible with color-blindness by using the scale_fill_viridis_d() function which is simply available by loading the ggplot2 package. There are a few variations such as discreet as _d, or binned continuous as _b, or continuous scale as _c. See here for more information.

It’s still a bit difficult to tell which line corresponds to which country. So, let’s add a label. One way to do this is to add text layer to our plot using the geom_text() function of the ggplot2 package. We need to first specify what data we will use, in this case we will filter for just the data for the last year (which we can do using the last() function of the dplyr package) and then we need to indicate that our label will be based on the Country variable using the aes() asthetics mapping argument. We will also get rid of our legend since we will not need it anymore, by using the theme() function of the ggplot2 package.

Not bad, but some of the labels are overlapping and difficult to read. We can use the check_overlap = TRUE argument within the geom_text() function to remove overlapping variables and we can expand the plot area horizontally so that the names are not cutoff by using scale_x_continuous(expand = c(0.2,0)).

This is easier to read now, but it also causes us to lose some of the labels. There are several alternative ways we can keep all of our labels and make them easier to read. The first package we will show is called directlabels.

The most simple option is to use the direct.label() function. which will automatically add lables at the end of the lines. However, it is a bit difficult to see some of our labels as they get automatically sized to fit the plot.

Alternatively this can be done in a more ggplot2 layering method by using the geom_dl() function.

This is nice and legible now. We have all 10 countries names listed and they are in order of the last data point and they are relatively close to the lines that they correspond to.

Another option is to use a different method in the directlables package. Here is a list of options.

The "angled.boxes" method looks nice for some plots but doesn’t work very well for our plot:

However the "last.polygons" method works quite well:

The second package is the ggrepel package which is especially good for crowded labels that might overlap one another. It alows for more control than the directlabels package. We will use the geom_text_repel() function. Just like with geom_text, first we need to specify what data we want to include. We then specify with the aes() argument that our label will be based on the Country variable and we again specify what variable to use for our x axis and y axis, so that we indicate where the labels should be plotted.

You can see that this package creates segments that connect the label to the line.

There are many arguments to use to style your labels just the way that you want:

See here for more details.

Nice, that looks pretty good.

Now let’s try showing our data in a different way. This time we will create a geom_tile plot. To color our plot we will use the viridis color pallette again but this time we will use the scale_fill_viridis_c(), recall that the _c indicates a continuous scale. See here for more information. Again, we will filter our data to include only the Countries included in the Country variable of the top_10_count. Recall that the pull() function specifically grabs the Country variable data values within top_10_count. Then we will use the fct_reorder() function of the forcats package to order our countries based on the last emission value in 2014.

To use this function, the variable that is to be reordered is listed first, then the variable that is being used to determine the order, followed by a function to determine the order, in this case the last value using the last() function (recall that this is also a function of the dplyr package).

We can also create this plot directly without using the top_10_count tibble, by creating a new variable for the last value that we will call last_val, or in other words the emission value in 2014 for each country. To do this we need to first use the group_by() function of the dplyr package to make sure that the last value is calculated and repeated for each row for a given country. Here you can see that that is the case for Afghanistan.

# A tibble: 14,542 x 7
# Groups:   Country [192]
   Country     Year Label                 Indicator Value Region        last_val
   <fct>      <dbl> <chr>                 <chr>     <dbl> <chr>            <dbl>
 1 Afghanist…  1949 CO2 Emissions (Metri… Emissions  14.7 Rest of the …     9810
 2 Afghanist…  1950 CO2 Emissions (Metri… Emissions  84.3 Rest of the …     9810
 3 Afghanist…  1951 CO2 Emissions (Metri… Emissions  91.7 Rest of the …     9810
 4 Afghanist…  1952 CO2 Emissions (Metri… Emissions  91.7 Rest of the …     9810
 5 Afghanist…  1953 CO2 Emissions (Metri… Emissions 106   Rest of the …     9810
 6 Afghanist…  1954 CO2 Emissions (Metri… Emissions 106   Rest of the …     9810
 7 Afghanist…  1955 CO2 Emissions (Metri… Emissions 154   Rest of the …     9810
 8 Afghanist…  1956 CO2 Emissions (Metri… Emissions 183   Rest of the …     9810
 9 Afghanist…  1957 CO2 Emissions (Metri… Emissions 293   Rest of the …     9810
10 Afghanist…  1958 CO2 Emissions (Metri… Emissions 330   Rest of the …     9810
# … with 14,532 more rows

Now we will also create a rank variable like we did when we created top_10_count that will be calculated as the rank of the countries based on the last_val value (again this is the emission value in the last year of the data, 2014). Now we want to ungroup our data, as we want the rank to be calculated across the countries.

# A tibble: 1,054 x 8
   Country  Year Label               Indicator Value Region       last_val  rank
   <fct>   <dbl> <chr>               <chr>     <dbl> <chr>           <dbl> <int>
 1 Canada   1900 CO2 Emissions (Met… Emissions 20600 Rest of the…   537000    10
 2 Canada   1901 CO2 Emissions (Met… Emissions 23900 Rest of the…   537000    10
 3 Canada   1902 CO2 Emissions (Met… Emissions 25700 Rest of the…   537000    10
 4 Canada   1903 CO2 Emissions (Met… Emissions 28000 Rest of the…   537000    10
 5 Canada   1904 CO2 Emissions (Met… Emissions 33100 Rest of the…   537000    10
 6 Canada   1905 CO2 Emissions (Met… Emissions 35400 Rest of the…   537000    10
 7 Canada   1906 CO2 Emissions (Met… Emissions 37400 Rest of the…   537000    10
 8 Canada   1907 CO2 Emissions (Met… Emissions 47000 Rest of the…   537000    10
 9 Canada   1908 CO2 Emissions (Met… Emissions 47400 Rest of the…   537000    10
10 Canada   1909 CO2 Emissions (Met… Emissions 45400 Rest of the…   537000    10
# … with 1,044 more rows

Now we can put it all together to create the plot directly from data_long.

We can see that Germany had very low emission rates at the end of World War II. We see that the US has consistently had high emission rates since 1900, but that the emission rates in China recently surpased that of the US. The portions of the plot that are white indicate that there is no emission data for that country.

Now let’s take a look at the data in slightly different way. Let’s look at overall global emissions by calculating a sum each year of all the emission values for the different countries. Note that this is limited to only the countries included in the dataset.

To calculate this value we will first use the group_by() function of the dplyr package. This will allow our calcluation to be performed on aggregated data by the different values for the Year variable. Otherwise, we would simply get a sum of overall emissions across all of the years in the data set.

Then we will use the summarize() function (also of the dplyr package) and the base sum() function to calculate a sum of the emission values each year.

Since we will be ploting only one value each year, we do not need to assign a group in the aes() argument. this time we will make the size of the line that will be plotted a bit larger using the size() argument in the geom_line() function.

Ok, we can now clearly see that global CO2 emissions have dramatically risen since 1900.

We can make an annimation of this plot using the gganimate package.

Yearly Growth in GDP per Capita (1801 to 2019)

Now we will take a look a GDP growth of various countries

We can see that the variation in GDP has become greater over time.

Energy Use per Person (1960 to 2015)

Let’s see who the top countries are. First let’s take a look at the year 2000, and then 2014.

# A tibble: 10 x 6
   Country            Year Label                   Indicator Value Region       
   <fct>             <dbl> <chr>                   <chr>     <dbl> <chr>        
 1 Qatar              2000 Energy Use (kg, oil-eq… Energy    18400 Rest of the …
 2 Bahrain            2000 Energy Use (kg, oil-eq… Energy    12000 Rest of the …
 3 Iceland            2000 Energy Use (kg, oil-eq… Energy    11100 Rest of the …
 4 United Arab Emir…  2000 Energy Use (kg, oil-eq… Energy     9990 Rest of the …
 5 Kuwait             2000 Energy Use (kg, oil-eq… Energy     9130 Rest of the …
 6 Canada             2000 Energy Use (kg, oil-eq… Energy     8240 Rest of the …
 7 United States      2000 Energy Use (kg, oil-eq… Energy     8060 United States
 8 Trinidad and Tob…  2000 Energy Use (kg, oil-eq… Energy     7760 Rest of the …
 9 Luxembourg         2000 Energy Use (kg, oil-eq… Energy     7680 Rest of the …
10 Brunei             2000 Energy Use (kg, oil-eq… Energy     7160 Rest of the …
# A tibble: 10 x 6
   Country            Year Label                   Indicator Value Region       
   <fct>             <dbl> <chr>                   <chr>     <dbl> <chr>        
 1 Qatar              2014 Energy Use (kg, oil-eq… Energy    18600 Rest of the …
 2 Iceland            2014 Energy Use (kg, oil-eq… Energy    17900 Rest of the …
 3 Trinidad and Tob…  2014 Energy Use (kg, oil-eq… Energy    14400 Rest of the …
 4 Bahrain            2014 Energy Use (kg, oil-eq… Energy    10600 Rest of the …
 5 Kuwait             2014 Energy Use (kg, oil-eq… Energy     8960 Rest of the …
 6 Brunei             2014 Energy Use (kg, oil-eq… Energy     8630 Rest of the …
 7 Canada             2014 Energy Use (kg, oil-eq… Energy     7880 Rest of the …
 8 United Arab Emir…  2014 Energy Use (kg, oil-eq… Energy     7770 Rest of the …
 9 United States      2014 Energy Use (kg, oil-eq… Energy     6960 United States
10 Saudi Arabia       2014 Energy Use (kg, oil-eq… Energy     6940 Rest of the …

Crude Mortality Rate

Let’s take a look to see which countries account for the large peaks in Morality in the late 1970s and the early 1990s. It’s always a good idea to check your data if you see anomolies like this.

# A tibble: 3 x 6
  Country      Year Label              Indicator Value Region           
  <fct>       <dbl> <chr>              <chr>     <dbl> <chr>            
1 Cambodia     1978 Deaths/1000 People Deaths     54.0 Rest of the World
2 Timor-Leste  1978 Deaths/1000 People Deaths     28.3 Rest of the World
3 Niger        1978 Deaths/1000 People Deaths     26.7 Rest of the World

Looks like Cambodia is the country with the large peak in the late 1970s. If you look up the history of Cambodia during this time period, you will see that the peak we are seeing makes sense because Cambodia experienced war and genicide during this time.

# A tibble: 3 x 6
  Country       Year Label              Indicator Value Region           
  <fct>        <dbl> <chr>              <chr>     <dbl> <chr>            
1 Rwanda        1993 Deaths/1000 People Deaths     41.4 Rest of the World
2 Sierra Leone  1993 Deaths/1000 People Deaths     26.1 Rest of the World
3 Niger         1993 Deaths/1000 People Deaths     21.4 Rest of the World

Rwanda is the country with the peak in the early 1990s. This also makes sense because Rwanda experienced a civil war at this time.

What about now? What countries have the highest rates?

# A tibble: 10 x 6
   Country    Year Label              Indicator Value Region           
   <fct>     <dbl> <chr>              <chr>     <dbl> <chr>            
 1 Bulgaria   2017 Deaths/1000 People Deaths     15.5 Rest of the World
 2 Latvia     2017 Deaths/1000 People Deaths     14.8 Rest of the World
 3 Serbia     2017 Deaths/1000 People Deaths     14.8 Rest of the World
 4 Lesotho    2017 Deaths/1000 People Deaths     14.7 Rest of the World
 5 Ukraine    2017 Deaths/1000 People Deaths     14.5 Rest of the World
 6 Lithuania  2017 Deaths/1000 People Deaths     14.2 Rest of the World
 7 Hungary    2017 Deaths/1000 People Deaths     13.5 Rest of the World
 8 Romania    2017 Deaths/1000 People Deaths     13.3 Rest of the World
 9 Croatia    2017 Deaths/1000 People Deaths     13   Rest of the World
10 Georgia    2017 Deaths/1000 People Deaths     12.9 Rest of the World

It seems that many eastern european countries currently have the highest mortality rates, as well as Lesotho.

Let’s make a plot of just these countries:

With the exception of Losotho, we can see that the mortality rate appears to be steadily increasing in these countries.

What countries have the lowest reported rates? We can simply alter our plot code to not use the descinding value to rank mortality.

Looks like many countries in the Persian Gulf region have the lowest rates of mortality.

Let’s make a plot of some of the countries that showed unusal patterns over time. We will include the US for comparison.

We can make a similar plot where each country is shown side by side by using the facet_grid() function of the ggplot2 package. We need to indicate what variable we would like to use to group the data by and indicate it with this symbol ~. If we include a period (to indicate all other variables) we can change the orientation of the plots:

  1. .~variable plots the subplots horizontally (plot the facet varible like the x axis)
  2. variable ~. plots the subplots vertically (plot the facet variable like the y axis)

We can see that recently the US has actually had higher mortality rates than Rwanda and Cambodia.

Let’s see how the US ranks.

# A tibble: 1 x 8
  Country       Year Label            Indicator Value Region      last_val  rank
  <fct>        <dbl> <chr>            <chr>     <dbl> <chr>          <dbl> <int>
1 United Stat…  2014 Deaths/1000 Peo… Deaths     8.24 United Sta…     8.24    68

The US ranked 68 out of 212 countries in 2014. This means that roughly 70% of the countries included had lower mortality rates than the US. See here and here for more information about mortality rates in the US.

US Disasters

Now let’s take a look at the disaster data for the US.

In general, it appears that temperatures have increased over time. We can add another ggplot2 layer by using the geom_smooth() to add a trend line. There are several methods to do this. We will use the loess method which stands for: Locally Weighted Smoothing. This method fits a trend to the data but does not assume that the trend will fit a particular shape.

We can see that the rate of disasters appears to be increasing over time. The added geom_smooth layer has added a blue trend line with the gray indicating the confidence interval of the trend line.

But what is a confidence interval?

A confidence interval gives an estimated range of values which is likely to include the true values of the entire population (for example all women in the US) if we are using just a small sample (for example 200 women in the US that take a survey) of the entire popultation. See here for more explanation about samples and populations.

Thus the gray area shows other possible trend lines that may fit the data of the acutal population.

####source

We could think of our data as the entire population. We have the actual counts for the number of disasters (based on specific definitions of disasters) that occured in the US each year from 1980 to 2010. Therefore, we would not need to calculate confidence intervals so we can remove them from our plot by using the se = FALSE argument of the geom_smooth() function of ggplot2. Confidence intervals are plotted by default as data is more often from a small sample of true populations and we try to generalize our trends based our sample to the true population.

Data Visualization


Now Let’s try putting some of the different data types together together. We have previously used facet_grid() to plot multiple subplots simultaneously. Now we will use the facet_wrap() function of the ggplot2 package, which also plots multiple subplots simultaneously, however it also allows for different scales for the y-axis of the subplots. This is preferable in this case becuase it is difficult to see the data if all the subplots were plotted with the same y-axis scale, as you can see here:

To use facet_wrap() with the option for a different y-axis scale for each subplot, we need to set the scales argment equal to "free_y". We can also indicate where we would like the label for the subplots to be located by using the strip.position argument. Notice that we can change the size or style of the font for these labels using the strip.text = argument of the theme() function. We can also specify how many rows or columns we would like the subplots to be shown.

Here we will facet by two variables: Indicator and Region (which is if the data is from the US or other countries). First we will fiter out the data about disasters and temperature as this is only for the US, by using the filter() function and != which indicates “not equal to”. In this case we want to use facet_grid() instead of facet_wrap() so that the same y-axis will be used across the rows.

We can also use scales = "free" with facet_wrap() to have a different axis for each plot.

From these plots we can see that each type of data spans a different time span.

Time spans of data

Let’s take a look at the reporting countries for each year for each type of data for the global indicators. To calculate the number of reporting countries we will use the tally() function of the dplyr package to get the count for each year and indicator. Thus we will first group by year and the Label variable (as a proxy for the Indicator variable), as this also specifies the different indicators but with additional information and formatting so that we can have nice labels in our plot.

We can add also vertical lines to our plot using the geom_vline() function of the ggplot2 package.

We can see that all of our data spans from 1980 to 2014.

What about the US data? We can summarize the data based on the minimum and maximum Year value using the summarize() function. Recall that this is a function of the dplyr package.

# A tibble: 6 x 3
  Label                           First_year Last_year
  <chr>                                <dbl>     <dbl>
1 CO2 Emissions (Metric Tons)           1800      2014
2 Deaths/1000 People                    1960      2017
3 Energy Use (kg, oil-eq./capita)       1960      2015
4 GDP Growth/Capita (%)                 1801      2019
5 Number of Disasters                   1980      2019
6 Temperature (Fahrenheit)              1895      2019

Now we will plot a segment line for the span using geom_segment() and points for the first years and last years using geom_point(). This time we will add horizontal lines using geom_hline() to show where the time spans overlap.

It looks like the overlapping time spans for the different datasets is from 1980 to 2014.

US-specific

Let’s plot all of the US indicators together.

We can also plot the data with points for the indivual values rather than a line using geom_point().

If we want to really look at how two indicators may relate to eachother, it is imporant that both datasets span the same amount of time. Therefore, we will limit this plot to only the years where the data overlaps for both CO2 emissions and temperature.

We can see that there are very similar patterns of CO2 emission levels an average annual temperatures. We will analyze this further in a bit. There are also some other common visualization techniques that utilize the mean of a set of values over a time span to show how values are changing over time in a different way.

To create such a visualization, we will first calculate the mean of our Emission and temperature values from 1980 to 2010 and create a new variable called Mean. Then we will calculate the difference of each value from the mean and create a new variable for these values called Diff_from_mean. Finally we will also create a factor variable about the sign of the Diff_from_mean value to distinguish positive or negative changes. We will use this to color our plots.

Rows: 186
Columns: 9
$ Country        <fct> United States, United States, United States, United St…
$ Year           <dbl> 1980, 1981, 1982, 1983, 1984, 1985, 1986, 1987, 1988, …
$ Label          <chr> "CO2 Emissions (Metric Tons)", "CO2 Emissions (Metric …
$ Indicator      <chr> "Emissions", "Emissions", "Emissions", "Emissions", "E…
$ Value          <dbl> 4720000, 4540000, 4310000, 4340000, 4480000, 4490000, …
$ Region         <chr> "United States", "United States", "United States", "Un…
$ Mean           <dbl> 5134194, 5134194, 5134194, 5134194, 5134194, 5134194, …
$ Diff_from_mean <dbl> -414193.548, -594193.548, -824193.548, -794193.548, -6…
$ Diff_color     <fct> -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1…

Ok, now we will create a plot that shows a bar for the change in each indicator from the mean value across the timespan for each year.

We can see from this plot that overall there has been an increase in Disasters, Emissions and Temperature in the most recent years.

What if we look at mortality, gdp, and disasters in the same way?

Luckily at this point depsite increased disaster rates, mortality appears to be decreasing. The GDP has been relatively consistent.

Now how about energy use and emissions?

Looks like in very recent years, there has been a decline in both energy use and CO2 emissions.

Data Analysis


We see that CO2 emission levels, annual average national temperatures, and disasters counts appear to be increasing over time, but how can we assess this statistically?

Correlation

We can use correlation. Correlation is a measure of strength the of a relationship between two variables. Often when we describe correlation we are referring to linear correlation and therefore the linear relationship between variables.

If we plot one variable on the x-axis and the other variable on the y-axis, we can see:

  1. the strength of the relationship - based on how well the points form a line
  2. the direction of the relationship - based on if the points progress upward or downward

If the variables point upward in a very clear line, then there is a strong positive relationship. If the points do not really form a line, then there is a weak linear realtionship or no linear relationship - there may however be a nonlinear relationship if the points create a different but defined shape. See here for more information. If the points form a downward sloping line, then there is a negative relationship.

source

The numbers bellow each plot above are called correlation coefficients. They range from -1 to 1. A value of zero indicates that there is no correlation between the variables. While a value of 1 or -1 indicates perfect correlation, the closer the coefficient is to 1 or -1, the stronger the relationship. The sign of the coeffficient indicates the direction of the relationship. If there is a negative relationship then the variables show opposing changes from each other - as one gets larger the other gets smaller. If the sign is positive, then the variables increase similarly.

Let’s take a look at our data now. We have already plotted our US indicators across time, but we did not look at the linear trend. We will do that now using geom_point() to plot the individual data points and this time we will use the "lm" method which stands for linear method for our geom_smooth() layer.

First let’s create a wide tibble for our US data so that we can similarly plot our data. To do this we will create a wide tibble using the pivot_wider() function of the dplyr package. This function requires values for two arguments, names_from and values_from. The variable that has the indentity or labels for the values that you wish to create multiple new variables names from is used for the names_from argument. The variable that contains the corresponding values for the new variables is used for the values_from argument.

Rows: 31
Columns: 9
$ Country     <fct> United States, United States, United States, United State…
$ Year        <dbl> 1980, 1981, 1982, 1983, 1984, 1985, 1986, 1987, 1988, 198…
$ Region      <chr> "United States", "United States", "United States", "Unite…
$ Emissions   <dbl> 4720000, 4540000, 4310000, 4340000, 4480000, 4490000, 450…
$ GDP         <dbl> -1.1300, 1.5000, -2.8200, 3.2500, 6.3600, 2.9500, 2.5000,…
$ Energy      <dbl> 7940, 7650, 7260, 7200, 7440, 7460, 7380, 7620, 7850, 789…
$ Deaths      <dbl> 8.8, 8.6, 8.5, 8.6, 8.7, 8.7, 8.7, 8.6, 8.9, 8.8, 8.6, 8.…
$ Disasters   <dbl> 3, 2, 3, 5, 2, 5, 2, 0, 1, 5, 3, 4, 7, 5, 6, 5, 4, 3, 10,…
$ Temperature <dbl> 52.39, 53.12, 51.34, 51.88, 51.97, 51.30, 53.32, 53.33, 5…

We can use the cor.test() of the stats package to calculate pearson’s correlation estimates, as well as confidence intervals for correlation estimates. This function allows for a few different methods to calculate correlation estimates. The default is the Pearson’s product-moment method. All three methods result in a correlation coefficient that ranges from -1 to 1 that indicate the strength of the association or relationship between the variables. However, each method has a slightly different calculation.

See here and here for more information.

In the case of our data, individual points would be the mesurements for each variable at each year.

[1] 0.4453282
[1] 0.9099066
[1] 0.5803805

We can see that in all cases, there appears to be a positive linear relationship between the tested US indicators and time. We see the relationship is positive becuase the correlation estimates are positive (as well as the fact that our plots show upward linear relationships).

We can assess the strength of the relationship based on this table which provides general guidelines:

We also see that the correlation of temperature with time is low, it is very strong for the emissions data, and moderate for the disaster data.

Linear Regression

We can also use a linear regression to evaluate the relationship between our variables. This helps us to answer slightly deeper questions like:

Do changes in time predict or explain changes in temperature, emission, or disaster values?

We can get the results from a linear model by using the base summary() function and the lm() function of the stats package.

The variable on the left of the ~ indicates what we are trying to predict also known as the dependent variable, while the variable(s) on the right are independent.


Call:
lm(formula = Temperature ~ Year, data = wide_US)

Residuals:
    Min      1Q  Median      3Q     Max 
-1.4681 -0.5662  0.1051  0.5750  1.2987 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)  
(Intercept) -28.26165   30.26858  -0.934   0.3582  
Year          0.04064    0.01517   2.678   0.0121 *
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 0.7556 on 29 degrees of freedom
Multiple R-squared:  0.1983,    Adjusted R-squared:  0.1707 
F-statistic: 7.174 on 1 and 29 DF,  p-value: 0.01206

Call:
lm(formula = Emissions ~ Year, data = wide_US)

Residuals:
    Min      1Q  Median      3Q     Max 
-544444 -125131   39181  151431  316431 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept) -90376432    8085611  -11.18 4.98e-12 ***
Year            47875       4053   11.81 1.33e-12 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 201800 on 29 degrees of freedom
Multiple R-squared:  0.8279,    Adjusted R-squared:  0.822 
F-statistic: 139.5 on 1 and 29 DF,  p-value: 1.327e-12

Call:
lm(formula = Disasters ~ Year, data = wide_US)

Residuals:
    Min      1Q  Median      3Q     Max 
-3.6331 -1.1774 -0.2702  0.8800  5.2520 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept) -313.0746    82.7922  -3.781 0.000722 ***
Year           0.1593     0.0415   3.838 0.000620 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 2.067 on 29 degrees of freedom
Multiple R-squared:  0.3368,    Adjusted R-squared:  0.314 
F-statistic: 14.73 on 1 and 29 DF,  p-value: 0.00062

In all cases, yes it appears that all of these indicators show a positive association (due to positive t value) with time - meaning they show an increase over time.

Notice that the Multiple R-squared value in the output is equal to the correlation coefficeint squared!

Since CO2 emission levels an average annual temperatures appear to have similar patterns over time, we might want to analyze if these values are correlated with one another.

We might also ask:

Are emission levels associated with temperature levels or disaster levels? Can we predict or explain temperature or disaster levels based on emission levels?

Let’s first plot both on the same plot, where emissions will be plotted on one axis and temperatures on the other.

Now we can caluculate Pearson correlation coefficients.

[1] 0.5429183
[1] 0.09489648
[1] 0.4686469

And finally peform linear regreession analysis:


Call:
lm(formula = Temperature ~ Emissions, data = wide_US)

Residuals:
    Min      1Q  Median      3Q     Max 
-1.4512 -0.4182 -0.0627  0.5443  1.1704 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept) 4.798e+01  1.394e+00  34.405   <2e-16 ***
Emissions   9.416e-07  2.705e-07   3.481   0.0016 ** 
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 0.7087 on 29 degrees of freedom
Multiple R-squared:  0.2948,    Adjusted R-squared:  0.2704 
F-statistic: 12.12 on 1 and 29 DF,  p-value: 0.0016

Call:
lm(formula = Disasters ~ Temperature, data = wide_US)

Residuals:
    Min      1Q  Median      3Q     Max 
-4.8260 -1.5306  0.0827  1.1797  7.4708 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)
(Intercept) -10.3939    29.3623  -0.354    0.726
Temperature   0.2854     0.5559   0.513    0.612

Residual standard error: 2.526 on 29 degrees of freedom
Multiple R-squared:  0.009005,  Adjusted R-squared:  -0.02517 
F-statistic: 0.2635 on 1 and 29 DF,  p-value: 0.6116

Call:
lm(formula = Disasters ~ Emissions, data = wide_US)

Residuals:
    Min      1Q  Median      3Q     Max 
-3.8160 -1.2161 -0.2805  0.9640  6.1595 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)   
(Intercept) -7.872e+00  4.411e+00  -1.785  0.08479 . 
Emissions    2.444e-06  8.556e-07   2.857  0.00783 **
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 2.242 on 29 degrees of freedom
Multiple R-squared:  0.2196,    Adjusted R-squared:  0.1927 
F-statistic: 8.162 on 1 and 29 DF,  p-value: 0.007833

Both temperature and the number of disasters per year appear to increase with increased CO2 emissions, as the p value is less than 0.05 in both regressions. However, the multiple R-squared value, and pearson correlation coefficients were moderate for both relationships. Suggesting that the relationship is not very strong and that there are likely other factors that influence temperature and disasters besides C02 emissions. This makes sense with what we know about the earth’s atmosphere. There are other greenhouse gases that contribute to warming temperatures, and the existing CO2 already in the atmosphere also traps heat and greatly impacts the temperature. Furthermore we are looking at US emissions and how they influence US temperatures, but there are also CO2 emissions produced by other countries. There are other aspects that influence disaster rate as well, such the rate of humidity levels and rainfall for fires.

While the analyses that we performed give us some indication of how these different datasets relate to one another, one would realisticly want to perform a mixed effects model or growth curve analysis to account for the fact that these data are paired across timepoints and may vary differently with time and to include these other factors that we just discussed. … AVOCADO needs links etc. feel free to help this section.

Now we will create a plot that summarizes our major findings. We will use the plot_layout() function of the patchwork package.

quartz_off_screen 
                2 

Homework


Ask students to create a plot with labels showing the countries with the lowest CO2 emission levels.

Ask students to plot energy use and emissions on a scatter plot, calculate the pearson correlation coeffecient, and discuss what the results mean.

Summary

Even though there is quite a bit of scientific evidence to indicate that in fact CO2 emissions trap heat and lead to increased global temperatures, it is important to realize that there are other factors involved in the relationship between US CO2 emissions and US annual average temperatures. However, it is vital that we work around the globe to reduce greenhouse gas emissions to meditigate the increased temperatures that we will experience due to the existing CO2 already in the atmosphere so that the warming temperatures aren’t as extreme as they could be. Furthermore, we need to prepare for increased rates of natural disasters and how these may influence people around the world. Evidence suggests that impoverished people are the most affected by diasters. We need to be particularly mindeful of this as we prepare.

LS0tCnRpdGxlOiAiT3BlbiBDYXNlIFN0dWRpZXMgOiBDTzIgRW1pc3Npb25zIE92ZXIgVGltZSIKYXV0aG9yOiAiTWljaGFlbCBPbnRpdmVyb3MsIENhcnJpZSBXcmlnaHQsIFBoRC4iCmNzczogc3R5bGUuY3NzCm91dHB1dDoKICBodG1sX2RvY3VtZW50OgogICAgc2VsZl9jb250YWluZWQ6IHllcwogICAgY29kZV9kb3dubG9hZDogeWVzCiAgICBoaWdobGlnaHQ6IHRhbmdvCiAgICBudW1iZXJfc2VjdGlvbnM6IG5vCiAgICB0aGVtZTogY29zbW8KICAgIHRvYzogeWVzCiAgICB0b2NfZmxvYXQ6IHllcwogIHBkZl9kb2N1bWVudDoKICAgIHRvYzogeWVzCiAgd29yZF9kb2N1bWVudDoKICAgIHRvYzogeWVzCi0tLQoKPHN0eWxlPgojVE9DIHsKICBiYWNrZ3JvdW5kOiB1cmwoImh0dHBzOi8vb3BlbmNhc2VzdHVkaWVzLmdpdGh1Yi5pby9pbWcvbG9nby5qcGciKTsKICBiYWNrZ3JvdW5kLXNpemU6IGNvbnRhaW47CiAgcGFkZGluZy10b3A6IDI0MHB4ICFpbXBvcnRhbnQ7CiAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDsKfQo8L3N0eWxlPgoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChpbmNsdWRlID0gVFJVRSwgY29tbWVudCA9IE5BLCBlY2hvID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBjYWNoZSA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgZmlnLmFsaWduID0gImNlbnRlciIsIG91dC53aWR0aCA9ICc5MCUnKQpsaWJyYXJ5KGhlcmUpCmxpYnJhcnkoa25pdHIpCmBgYAoKIyMjIyB7Lm91dGxpbmUgfQpgYGB7ciwgZWNobyA9IEZBTFNFLCBvdXQud2lkdGggPSAiODAwIHB4In0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoaGVyZTo6aGVyZSgiaW1nIiwgIm1haW5wbG90LnBuZyIpKQpgYGAKCiMjIyMKCiMjIHsuZGlzY2xhaW1lcl9ibG9ja30KCioqRGlzY2xhaW1lcioqOiBUaGUgcHVycG9zZSBvZiB0aGUgW09wZW4gQ2FzZSBTdHVkaWVzXShodHRwczovL29wZW5jYXNlc3R1ZGllcy5naXRodWIuaW8pe3RhcmdldD0iX2JsYW5rIn0gcHJvamVjdCBpcyAqKnRvIGRlbW9uc3RyYXRlIHRoZSB1c2Ugb2YgdmFyaW91cyBkYXRhIHNjaWVuY2UgbWV0aG9kcywgdG9vbHMsIGFuZCBzb2Z0d2FyZSBpbiB0aGUgY29udGV4dCBvZiBtZXNzeSwgcmVhbC13b3JsZCBkYXRhKiouIEEgZ2l2ZW4gY2FzZSBzdHVkeSBkb2VzIG5vdCBjb3ZlciBhbGwgYXNwZWN0cyBvZiB0aGUgcmVzZWFyY2ggcHJvY2VzcywgaXMgbm90IGNsYWltaW5nIHRvIGJlIHRoZSBtb3N0IGFwcHJvcHJpYXRlIHdheSB0byBhbmFseXplIGEgZ2l2ZW4gZGF0YSBzZXQsIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGNvbnRleHQgb2YgbWFraW5nIHBvbGljeSBkZWNpc2lvbnMgd2l0aG91dCBleHRlcm5hbCBjb25zdWx0YXRpb24gZnJvbSBzY2llbnRpZmljIGV4cGVydHMuIAoKIyAqKk1vdGl2YXRpb24qKgoqKiogCgpUaGlzIGNhc2Ugc3R1ZHkgZXhwbG9yZXMgaG93IGRpZmZlcmVudCBjb3VudHJpZXMgaGF2ZSBjb250cmlidXRlZCB0byBDYXJib24gRGlveGlkZSAoQ08yKSBlbWlzc2lvbnMgb3ZlciB0aW1lIGFuZCBob3cgQ08yIGVtaXNzaW9uIHJhdGVzIG1heSByZWxhdGUgdG8gaW5jcmVhc2luZyBnbG9iYWwgdGVtcGVyYXR1cmVzIGFuZCBpbmNyZWFzZWQgcmF0ZXMgb2YgbmF0dXJhbCBkaXNhc3RlcnMgYW5kIHN0b3Jtcy4gVGhpcyByZXBvcnQgcHJvdmlkZXMgYSBiYXNpcyBmb3IgdGhlIG1vdGl2YXRpb246IGh0dHBzOi8vd3d3LmVwYS5nb3YvcmVwb3J0LWVudmlyb25tZW50L2dyZWVuaG91c2UtZ2FzZXMuCgoKQ08yIG1ha2VzIHVwIHRoZSBsYXJnZXN0IHByb3BvcnRpb24gb2YgZ3JlZW5ob3VzZSBnYXMgZW1pc3Npb25zIGluIHRoZSBVbml0ZWQgU3RhdGVzOgoKCmBgYHtyLCBlY2hvID0gRkFMU0UsIG91dC53aWR0aD0iNTAwcHgifQprbml0cjo6aW5jbHVkZV9ncmFwaGljcyhoZXJlOjpoZXJlKCJpbWciLCAiZW1pc3Npb25zLmpwZyIpKQpgYGAKCkEgdmFyaWV0eSBvZiBzb3VyY2VzIGFuZCBzZWN0b3JzIGNvbnRyaWJ1dGUgdG8gZ3JlZW5ob3VzZSBnYXMgZW1pc3Npb25zLCB3aXRoIHRyYW5zcG9ydGF0aW9uIGNvbnRyaWJ1dGluZyB0aGUgbW9zdCBtZXRyaWMgdG9ucyBvZiBDTzI6CgoKYGBge3IsIGVjaG8gPSBGQUxTRSwgb3V0LndpZHRoPSI2MDBweCJ9CmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKGhlcmU6OmhlcmUoImltZyIsICJzZWN0b3IucG5nIikpCmBgYAoKU28gd2h5IHNob3VsZCB3ZSBwYXkgYXR0ZW50aW9uIHRvIGdyZWVuaG91c2UgZ2FzZXM/CgpBY2NvcmRpbmcgdG8gdGhlIFtVUyBFbnZpcm9ubWVudGFsIFByb3RlY3Rpb24gQWdlbmN5IChFUEEpIEludmVudG9yeSBvZiBVLlMuIEdyZWVuaG91c2UgR2FzIEVtaXNzaW9ucyBhbmQgU2lua3MgMjAyMCBSZXBvcnRdKGh0dHBzOi8vd3d3LmVwYS5nb3YvZ2hnZW1pc3Npb25zL2ludmVudG9yeS11cy1ncmVlbmhvdXNlLWdhcy1lbWlzc2lvbnMtYW5kLXNpbmtzKTogCgo+IEdyZWVuaG91c2UgZ2FzZXMgYWJzb3JiIGluZnJhcmVkIHJhZGlhdGlvbiwgdGhlcmVieSB0cmFwcGluZyBoZWF0IGluIHRoZSBhdG1vc3BoZXJlIGFuZCBtYWtpbmcgdGhlIHBsYW5ldCB3YXJtZXIuIFRoZSBtb3N0IGltcG9ydGFudCBncmVlbmhvdXNlIGdhc2VzIGRpcmVjdGx5IGVtaXR0ZWQgYnkgaHVtYW5zIGluY2x1ZGUgY2FyYm9uIGRpb3hpZGUgKENPMiksIG1ldGhhbmUgKENINCksIG5pdHJvdXMgb3hpZGUgKE4yTyksIGFuZCBzZXZlcmFsIGZsdW9yaW5lLWNvbnRhaW5pbmcgaGFsb2dlbmF0ZWQgc3Vic3RhbmNlcy4gQWx0aG91Z2ggQ08yLCBDSDQsIGFuZCBOMk8gb2NjdXIgbmF0dXJhbGx5IGluIHRoZSBhdG1vc3BoZXJlLCBodW1hbiBhY3Rpdml0aWVzIGhhdmUgY2hhbmdlZCB0aGVpciBhdG1vc3BoZXJpYyBjb25jZW50cmF0aW9ucy4gRnJvbSB0aGUgcHJlLSBpbmR1c3RyaWFsIGVyYSAoaS5lLiwgZW5kaW5nIGFib3V0IDE3NTApIHRvIDIwMTgsIGNvbmNlbnRyYXRpb25zIG9mIHRoZXNlIGdyZWVuaG91c2UgZ2FzZXMgaGF2ZSBpbmNyZWFzZWQgZ2xvYmFsbHkgYnkgNDYsIDE2NSwgYW5kIDIzIHBlcmNlbnQsIHJlc3BlY3RpdmVseSAoSVBDQyAyMDEzOyBOT0FBL0VTUkwgMjAxOWEsIDIwMTliLCAyMDE5YykuIAoKKiBJUENDIHN0YW5kcyBmb3IgdGhlIEludGVyZ292ZXJubWVudGFsIFBhbmVsIG9uIENsaW1hdGUgQ2hhbmdlCgpUaGVyZSBhcmUgbWFueSBzaWducyB0aGF0IG91ciBwbGFuZXQgaXMgZXhwZXJpZW5jaW5nIHdhcm1lciB0ZW1wZXJhdHVyZXM6CgpgYGB7ciwgZWNobyA9IEZBTFNFLCBvdXQud2lkdGg9IjYwMHB4In0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoaGVyZTo6aGVyZSgiaW1nIiwgIndhcm1pbmcucG5nIikpCmBgYAoKVGhlIGNvbm5lY3Rpb24gYmV0d2VlbiBncmVlbmhvdXNlIGdhcyBsZXZlbHMgYW5kIGdsb2JhbCB0ZW1wZXJhdHVyZXMgYW5kIHRoZSBpbmZsdWVuY2Ugb2YgaW5jcmVhc2VkIGdsb2JhbCB0ZW1wZXJhdHVyZXMgb24gaHVtYW4gaGVhbHRoIGFyZSBtb3RpdmF0ZWQgYnkgdGhlc2UgcmVwb3J0czoKCiMjIyMgey5yZWZlcmVuY2VfYmxvY2t9CgpNZWxpbGxvLCBKLk0uLCBULkMuIFJpY2htb25kLCBhbmQgRy5XLiBZb2hlIChlZHMuKS4gMjAxNC4gQ2xpbWF0ZSBjaGFuZ2UgaW1wYWN0cyBpbiB0aGUgVW5pdGVkIFN0YXRlczogVGhlIHRoaXJkIE5hdGlvbmFsIENsaW1hdGUgQXNzZXNzbWVudC4gVS5TLiBHbG9iYWwgQ2hhbmdlIFJlc2VhcmNoIFByb2dyYW0uICAKCjIwMjAuIOKAnEludmVudG9yeSBvZiBVUyBHcmVlbmhvdXNlIEdhcyBFbWlzc2lvbnMgYW5kIFNpbmtzOiAxOTkwLS0yMDE4LuKAnSBFUEEgNDMwLVItMjAtMDAyLCBUZWNoLiBSZXAuIGh0dHBzOi8vd3d3LmVwYS5nb3YvZ2hnZW1pc3Npb25zL2ludmVudG9yeS11cy1ncmVlbmhvdXNlLWdhcy1lbWlzc2lvbnMtYW5kLXNpbmtzLgoKCiMjIyMKClRoZSBOYXRpb25hbCBDbGltYXRlIEFzc2Vzc21lbnQgUmVwb3J0IHN0YXRlcyB0aGF0OgoKPiBIZWF0LXRyYXBwaW5nIGdhc2VzIGFscmVhZHkgaW4gdGhlIGF0bW9zcGhlcmUgaGF2ZSBjb21taXR0ZWQgdXMgdG8gYSBob3R0ZXIgZnV0dXJlIHdpdGggbW9yZSBjbGltYXRlLXJlbGF0ZWQgaW1wYWN0cyBvdmVyIHRoZSBuZXh0IGZldyBkZWNhZGVzLiBUaGUgbWFnbml0dWRlIG9mIGNsaW1hdGUgY2hhbmdlIGJleW9uZCB0aGUgbmV4dCBmZXcgZGVjYWRlcyBkZXBlbmRzIHByaW1hcmlseSBvbiB0aGUgYW1vdW50IG9mIGhlYXQtdHJhcHBpbmcgZ2FzZXMgdGhhdCBodW1hbiBhY3Rpdml0aWVzIGVtaXQgZ2xvYmFsbHksIG5vdyBhbmQgaW4gdGhlIGZ1dHVyZS4KClNlZSBbaGVyZV0oaHR0cHM6Ly93d3cuZXBhLmdvdi9yZXBvcnQtZW52aXJvbm1lbnQvZ3JlZW5ob3VzZS1nYXNlcykgYW5kIFtoZXJlXShodHRwczovL3dvcmxkMTAxLmNmci5vcmcvZ2xvYmFsLWVyYS1pc3N1ZXMvY2xpbWF0ZS1jaGFuZ2UvY2xpbWF0ZS1jaGFuZ2UtYWRhcHRhdGlvbnMpIGZvciBtb3JlIGluZm9ybWF0aW9uLgoKIyAqKk1haW4gUXVlc3Rpb25zKioKKioqIAoKIyMjIyB7Lm1haW5fcXVlc3Rpb25fYmxvY2t9CjxiPjx1PiBPdXIgbWFpbiBxdWVzdGlvbjogPC91PjwvYj4KCjEpIEhvdyBoYXZlIGdsb2JhbCBDTzIgZW1pc3Npb24gcmF0ZXMgY2hhbmdlZCBvdmVyIHRpbWU/IEluIHBhcnRpY3VsYXIgZm9yIHRoZSBVUywgYW5kIGhvdyBkb2VzIHRoZSBVUyBjb21wYXJlIHRvIG90aGVyIGNvdW50cmllcz8gCjIpIEFyZSBVUyBDTzIgZW1pc3Npb25zLCBnbG9iYWwgdGVtcGVyYXR1cmVzLCBhbmQgVVMgc3Rvcm0gcmF0ZXMgYXNzb2NpYXRlZD8gCgojIyMjCgojICoqTGVhcm5pbmcgT2JqZWN0aXZlcyoqIAoqKiogCgpJbiB0aGlzIGNhc2Ugc3R1ZHksIHdlIHdpbGwgZXhwbG9yZSBDTzIgZW1pc3Npb24gZGF0YSBmcm9tIGFyb3VuZCB0aGUgd29ybGQuIFdlIHdpbGwgYWxzbyBmb2N1cyBvbiB0aGUgVVMgc3BlY2lmaWNhbGx5IHRvIGV2YWx1YXRlIHBhdHRlcm5zIG9mIHRlbXBlcmF0dXJlcyBhbmQgc3Rvcm0gYWN0aXZpdHkuIFRoaXMgY2FzZSBzdHVkeSB3aWxsIHBhcnRpY3VsYXJseSBmb2N1cyBvbiBob3cgdG8gdXNlIGRpZmZlcmVudCBkYXRhc2V0cyB0aGF0IHNwYW4gZGlmZmVyZW50IHJhbmdlcyBvZiB0aW1lLCBhcyB3ZWxsIGFzIGhvdyB0byBjcmVhdGUgdmlzdWFsaXphdGlvbnMgb2YgcGF0dGVybnMgb3ZlciB0aW1lLiBXZSB3aWxsIGVzcGVjaWFsbHkgZm9jdXMgb24gdXNpbmcgcGFja2FnZXMgYW5kIGZ1bmN0aW9ucyBmcm9tIHRoZSBbYFRpZHl2ZXJzZWBdKGh0dHBzOi8vd3d3LnRpZHl2ZXJzZS5vcmcvKXt0YXJnZXQ9Il9ibGFuayJ9LCBzdWNoIGFzIGBkcGx5cmAsIGB0aWR5cmAsIGBnZ3Bsb3QyYGFuZCBgZ2dhbmltYXRlYC4gVGhlIHRpZHl2ZXJzZSBpcyBhIGxpYnJhcnkgb2YgcGFja2FnZXMgY3JlYXRlZCBieSBSU3R1ZGlvLiBXaGlsZSBzb21lIHN0dWRlbnRzIG1heSBiZSBmYW1pbGlhciB3aXRoIHByZXZpb3VzIFIgcHJvZ3JhbW1pbmcgcGFja2FnZXMsIHRoZXNlIHBhY2thZ2VzIG1ha2UgZGF0YSBzY2llbmNlIGluIFIgZXNwZWNpYWxseSBlZmZpY2llbnQuCgoKKioqIAoKCldlIHdpbGwgYmVnaW4gYnkgbG9hZGluZyB0aGUgcGFja2FnZXMgdGhhdCB3ZSB3aWxsIG5lZWQ6CgpgYGB7cn0KbGlicmFyeShoZXJlKQpsaWJyYXJ5KHJlYWR4bCkKbGlicmFyeShyZWFkcikKbGlicmFyeShkcGx5cikKbGlicmFyeShtYWdyaXR0cikKbGlicmFyeSh0aWR5dmVyc2UpCiNsaWJyYXJ5KHBsb3RseSkKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KGdnYW5pbWF0ZSkKbGlicmFyeShkaXJlY3RsYWJlbHMpCmxpYnJhcnkoZ2dyZXBlbCkKbGlicmFyeShSQ29sb3JCcmV3ZXIpCmxpYnJhcnkocGF0Y2h3b3JrKQpgYGAKCgogUGFja2FnZSAgIHwgVXNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotLS0tLS0tLS0tIHwtLS0tLS0tLS0tLS0tCltoZXJlXShodHRwczovL2dpdGh1Yi5jb20vamVubnliYy9oZXJlX2hlcmUpe3RhcmdldD0iX2JsYW5rIn0gICAgICAgfCB0byBlYXNpbHkgbG9hZCBhbmQgc2F2ZSBkYXRhCltyZWFkeGxdKGh0dHBzOi8vcmVhZHhsLnRpZHl2ZXJzZS5vcmcvKXt0YXJnZXQ9Il9ibGFuayJ9ICB8IHRvIGltcG9ydCB0aGUgZXhjZWwgZmlsZSBkYXRhCltyZWFkcl0oaHR0cHM6Ly9yZWFkci50aWR5dmVyc2Uub3JnLyl7dGFyZ2V0PSJfYmxhbmsifSAgfCB0byBpbXBvcnQgdGhlIGNzdiBmaWxlIGRhdGEKW2RwbHlyXShodHRwczovL2RwbHlyLnRpZHl2ZXJzZS5vcmcvKXt0YXJnZXQ9Il9ibGFuayJ9ICB8ICB0byB2aWV3IGFuZCB3cmFuZ2xlIHRoZSBkYXRhClttYWdyaXR0cl0oaHR0cHM6Ly9jcmFuLnItcHJvamVjdC5vcmcvd2ViL3BhY2thZ2VzL21hZ3JpdHRyL3ZpZ25ldHRlcy9tYWdyaXR0ci5odG1sKXt0YXJnZXQ9Il9ibGFuayJ9ICB8ICB0byB1c2UgYW5kIHJlYXNzaWduIGRhdGEgb2JqZWN0cyB1c2luZyB0aGUgYCU8PiVgcGlwZSBvcGVyYXRvcgpbdGlkeXZlcnNlXShodHRwczovL3d3dy50aWR5dmVyc2Uub3JnL3BhY2thZ2VzLyl7dGFyZ2V0PSJfYmxhbmsifSAgfCB0byB3cmFuZ2xlIHRoZSBkYXRhIGFuZCBjcmVhdGUgZ2dwbG90MiBwbG90cwojIyMjW3Bsb3R5bHldKGh0dHBzOi8vcGxvdGx5LmNvbS9yLyl7dGFyZ2V0PSJfYmxhbmsifSAgfCB0byBtYWtlIHRoZSB2aXN1YWxpemF0aW9ucwpbZ2dwbG90Ml0oaHR0cHM6Ly9nZ3Bsb3QyLnRpZHl2ZXJzZS5vcmcvKXt0YXJnZXQ9Il9ibGFuayJ9IHwgdG8gbWFrZSB2aXN1YWxpemF0aW9ucwpbZGlyZWN0bGFiZWxzXShodHRwOi8vZGlyZWN0bGFiZWxzLnItZm9yZ2Uuci1wcm9qZWN0Lm9yZy9kb2NzL2luZGV4Lmh0bWwpe3RhcmdldD0iX2JsYW5rIn0gfCB0byBhZGQgbGFiZWxzIHRvIHBsb3RzIGVhc2lseQpbZ2dyZXBlbF0oaHR0cHM6Ly9jcmFuLnItcHJvamVjdC5vcmcvd2ViL3BhY2thZ2VzL2dncmVwZWwvdmlnbmV0dGVzL2dncmVwZWwuaHRtbCl7dGFyZ2V0PSJfYmxhbmsifSB8IHRvIGFkZCBsYWJlbHMgdGhhdCBkb24ndCBvdmVybGFwIHRvIHBsb3RzCltnZ2FuaW1hdGVdKGh0dHBzOi8vZ2dhbmltYXRlLmNvbS8pe3RhcmdldD0iX2JsYW5rIn0gIHwgdG8gbWFrZSB0aGUgcGxvdHMgaW50ZXJhY3RpdmUKW1JDb2xvckJyZXdlcl0oaHR0cHM6Ly9jcmFuLnItcHJvamVjdC5vcmcvd2ViL3BhY2thZ2VzL1JDb2xvckJyZXdlci9pbmRleC5odG1sKXt0YXJnZXQ9Il9ibGFuayJ9ICB8IHRvIGhhdmUgZ3JlYXRlciBjb250cm9sIG92ZXIgdGhlIGNvbG9yIGluIG91ciBwbG90cwpbcGF0Y2h3b3JrXShodHRwczovL2dpdGh1Yi5jb20vdGhvbWFzcDg1L3BhdGNod29yayl7dGFyZ2V0PSJfYmxhbmsifSAgfCB0byBjb21iaW5lIHBsb3RzClRoZSBmaXJzdCB0aW1lIHdlIHVzZSBhIGZ1bmN0aW9uLCB3ZSB3aWxsIHVzZSB0aGUgYDo6YCB0byBpbmRpY2F0ZSB3aGljaCBwYWNrYWdlIHdlIGFyZSB1c2luZy4gVW5sZXNzIHdlIGhhdmUgb3ZlcmxhcHBpbmcgZnVuY3Rpb24gbmFtZXMsIHRoaXMgaXMgbm90IG5lY2Vzc2FyeSwgYnV0IHdlIHdpbGwgaW5jbHVkZSBpdCBoZXJlIHRvIGJlIGluZm9ybWF0aXZlIGFib3V0IHdoZXJlIHRoZSBmdW5jdGlvbnMgd2Ugd2lsbCB1c2UgY29tZSBmcm9tLgoKCiMgKipDb250ZXh0KioKKioqIAoKR3JlZW5ob3VzZSBnYXMgZW1pc3Npb25zIGFyZSBkdWUgdG8gYm90aCBuYXR1cmFsIHByb2Nlc3NlcyBhbmQgYW50aHJvcG9nZW5pYyAoaHVtYW4tZGVyaXZlZCkgYWN0aXZpdGllcy4gCgpUaGVzZSBlbWlzc2lvbnMgYXJlIG9uZSBvZiB0aGUgY29udHJpYnV0aW5nIGZhY3RvcnMgdG8gcmlzaW5nIGdsb2JhbCB0ZW1wZXJhdHVyZXMsIHdoaWNoIGNhbiBoYXZlIGEgZ3JlYXQgaW5mbHVlbmNlIG9uIFtwdWJsaWMgaGVhbHRoXShodHRwczovL3d3dy5lcGEuZ292L2NsaW1hdGUtaW5kaWNhdG9ycy91bmRlcnN0YW5kaW5nLWNvbm5lY3Rpb25zLWJldHdlZW4tY2xpbWF0ZS1jaGFuZ2UtYW5kLWh1bWFuLWhlYWx0aCl7dGFyZ2V0PSJfYmxhbmsifSAgYXMgaWxsdXN0cmF0ZWQgaW4gdGhlIGZvbGxvd2luZyBpbWFnZToKCmBgYHtyLCBlY2hvID0gRkFMU0UsIG91dC53aWR0aD0iODAwcHgifQprbml0cjo6aW5jbHVkZV9ncmFwaGljcyhoZXJlOjpoZXJlKCJpbWciLCAiaGVhbHRoLnBuZyIpKQpgYGAKCj4gR2FzZXMgaW4gdGhlIGF0bW9zcGhlcmUgY2FuIGNvbnRyaWJ1dGUgdG8gY2xpbWF0ZSBjaGFuZ2UgYm90aCBkaXJlY3RseSBhbmQgaW5kaXJlY3RseS4gRGlyZWN0IGVmZmVjdHMgb2NjdXIgd2hlbiB0aGUgZ2FzIGl0c2VsZiBhYnNvcmJzIHJhZGlhdGlvbi4gSW5kaXJlY3QgcmFkaWF0aXZlIGZvcmNpbmcgb2NjdXJzIHdoZW4gY2hlbWljYWwgdHJhbnNmb3JtYXRpb25zIG9mIHRoZSBzdWJzdGFuY2UgcHJvZHVjZSBvdGhlciBncmVlbmhvdXNlIGdhc2VzLCB3aGVuIGEgZ2FzIGluZmx1ZW5jZXMgdGhlIGF0bW9zcGhlcmljIGxpZmV0aW1lcyBvZiBvdGhlciBnYXNlcywgYW5kL29yIHdoZW4gYSBnYXMgYWZmZWN0cyBhdG1vc3BoZXJpYyBwcm9jZXNzZXMgdGhhdCBhbHRlciB0aGUgcmFkaWF0aXZlIGJhbGFuY2Ugb2YgdGhlIGVhcnRoIChlLmcuLCBhZmZlY3QgY2xvdWQgZm9ybWF0aW9uIG9yIGFsYmVkbykuIFRoZSBJUENDIGRldmVsb3BlZCB0aGUgR2xvYmFsIFdhcm1pbmcgUG90ZW50aWFsIChHV1ApIGNvbmNlcHQgdG8gY29tcGFyZSB0aGUgYWJpbGl0eSBvZiBhIGdyZWVuaG91c2UgZ2FzIHRvIHRyYXAgaGVhdCBpbiB0aGUgYXRtb3NwaGVyZSByZWxhdGl2ZSB0byBhbm90aGVyIGdhcy4KVGhlIEdXUCBvZiBhIGdyZWVuaG91c2UgZ2FzIGlzIGRlZmluZWQgYXMgdGhlIHJhdGlvIG9mIHRoZSBhY2N1bXVsYXRlZCByYWRpYXRpdmUgZm9yY2luZyB3aXRoaW4gYSBzcGVjaWZpYyB0aW1lIGhvcml6b24gY2F1c2VkIGJ5IGVtaXR0aW5nIDEga2lsb2dyYW0gb2YgdGhlIGdhcywgcmVsYXRpdmUgdG8gdGhhdCBvZiB0aGUgcmVmZXJlbmNlIGdhcyBDTzIgKElQQ0MgMjAxMykuIFRoZXJlZm9yZSBHV1Atd2VpZ2h0ZWQgZW1pc3Npb25zIGFyZSBwcm92aWRlZCBpbiBtaWxsaW9uIG1ldHJpYyB0b25zIG9mIENPMiBlcXVpdmFsZW50IChNTVQgQ08yIEVxLikKCgogQ08yIGlzIGFjdHVhbGx5IHRoZSBsZWFzdCBjYXBhYmxlIG9mIHRoZSBncmVlbmhvdXNlIGdhc2VzIGZvciB0cmFwcGluZyBoZWF0OgoKYGBge3IsIGVjaG8gPSBGQUxTRSwgb3V0LndpZHRoPSI4MDBweCJ9CmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKGhlcmU6OmhlcmUoImltZyIsICJHV1AucG5nIikpCmBgYAoKSG93ZXZlciwgYmVjYXVzZSBDTzIgaXMgc28gbXVjaCBtb3JlIGFidW5kYW50IGFuZCBzdGF5cyBpbiB0aGUgYXRtb3NwaGVyZSBzbyBtdWNoIGxvbmdlciB0aGFuIG90aGVyIGdyZWVuaG91c2UgZ2FzZXMsIGl0IGhhcyBiZWVuIHRoZSBsYXJnZXN0IGNvbnRyaWJ1dG9yIHRvIGdsb2JhbCB3YXJtaW5nLgoKU2VlIFtoZXJlXShodHRwczovL3d3dy51Y3N1c2Eub3JnL3Jlc291cmNlcy93aHktZG9lcy1jbzItZ2V0LW1vcmUtYXR0ZW50aW9uLW90aGVyLWdhc2VzIzp+OnRleHQ9Q08yJTIwc3RpY2tzJTIwYXJvdW5kLG94aWRlJTIwKE4yTyl7dGFyZ2V0PSJfYmxhbmsifS4pCmZvciBtb3JlIGRldGFpbHMuCgoKRnVydGhlcm1vcmUsIHNpemluZyBDTzIgbGV2ZWxzIGFsc28gaW5mbHVlbmNlIG9jZWFuIGFjaWRpdHk6CgpgYGB7ciwgZWNobyA9IEZBTFNFLCBvdXQud2lkdGg9IjUwMHB4In0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoaGVyZTo6aGVyZSgiaW1nIiwgIm9jZWFucy5wbmciKSkKYGBgCgpUaGlzIG1ha2VzIGl0IGRpZmZpY3VsdCBmb3Igb3JnYW5pc21zIHRvIG1haW50YWluIHRoZWlyIHNoZWxscyBvciBza2VsZXRvbnMgdGhhdCBhcmUgbWFkZSBvZiBjYWxjaXVtIGNhcmJvbmF0ZSwgdGh1cyBtYWtpbmcgaXQgbW9yZSBkaWZmaWN1bHQgZm9yIHRoZXNlIG9yZ2FuaXNtcyB0byBzdXJ2aXZlIGFuZCBpbXBhY3RpbmcgdGhlaXIgcm9sZSBpbiB0aGUgZWNvc3lzdGVtIGFuZCBmb29kIGNoYWluLiAKCgpGdXJ0aGVybW9yZSwgZ3JlZW5ob3VzZSBnYXMgZW1pc3Npb25zIGFyZSBiZWxpZXZlZCB0byBpbmZsdWVuY2Ugc3Rvcm0gcmF0ZXMuIAoKSW5kZWVkIGV2ZW50cyB3aXRoIGhpZ2ggbGV2ZWxzIG9mIHByZWNpcGl0YXRpb24gd2hpY2ggY2FuIGluZHVjZSBmbG9vZGluZyBhbmQgcHJvcGVydHkgZGFtYWdlIGFyZSBnZW5lcmFsbHkgaW5jcmVhc2luZyBhcm91bmQgdGhlIGNvdW50cnk6CgpgYGB7ciwgZWNobyA9IEZBTFNFLCBvdXQud2lkdGg9IjUwMHB4In0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoaGVyZTo6aGVyZSgiaW1nIiwgInN0b3Jtcy5wbmciKSkKYGBgCgoKIyAqKkxpbWl0YXRpb25zKioKKioqIAoKVGhlcmUgYXJlIHNvbWUgaW1wb3J0YW50IGNvbnNpZGVyYXRpb25zIHJlZ2FyZGluZyB0aGlzIGRhdGEgYW5hbHlzaXMgdG8ga2VlcCBpbiBtaW5kOiAKCjEpIFRoZSBkYXRhc2V0cyBpbmNsdWRlZCBvbmx5IGluY2x1ZGUgY291bnRyaWVzIGFuZCB5ZWFycyBpbiB3aGljaCBjb3VudHJpZXMgd2VyZSByZXBvcnRpbmcgc3VjaCBpbmZvcm1hdGlvbiB0byB0aGUgYWdlbmNpZXMgdGhhdCBjb2xsZWN0ZWQgdGhlIGRhdGEuIFRodXMgdGhlIGRhdGEgaXMgaW5jb21wbGV0ZS4gRm9yIGV4YW1wbGUgd2hpbGUgd2UgaGF2ZSBhIGZhaXJseSBnb29kIHNlbnNlIG9mIENPMiBlbWlzc2lvbnMgZ2xvYmFsbHkgZm9yIGxhdGVyIHllYXJzLCBhZGRpdGlvbmFsIGVtaXNzaW9ucyB3ZXJlIGFsc28gcHJvZHVjZWQgYnkgY291bnRyaWVzIHRoYXQgYXJlIG5vdCBpbmNsdWRlZCBpbiB0aGUgZGF0YS4KCjIpIFtDb3JyZWxhdGlvbiBvciBhc3NvY2lhdGlvbiBkb2VzIG5vdCBpbXBseSBjYXVzYXRpb25dKGh0dHBzOi8vZGZyaWVkcy5jb20vbWF0aC9jb3JyZWxhdGlvbi1kb2VzLW5vdC1pbXBseS1jYXVzYXRpb24uaHRtbCl7dGFyZ2V0PSJfYmxhbmsifS4gV2Ugd2lsbCBiZSBzaG93aW5nIGhvdyBkaWZmZXJlbnQgZGF0YXNldHMgc2hvdyBzaW1pbGFyIHRyZW5kcyBhY3Jvc3MgdGltZS4gVGhpcyBkb2VzIG5vdCBpbXBseSB0aGF0IG9uZSBjYXVzZWQgdGhlIG90aGVyLiBIb3dldmVyLCBpbiB0aGUgY2FzZSBvZiBzb21lIG9mIHRoZSBkYXRhIHdlIHdpbGwgc2hvdywgdGhlcmUgaXMgYWRkaXRpb25hbCBzY2llbnRpZmljIGV2aWRlbmNlIHRvIHN1Z2dlc3QgdGhhdCBmb3IgZXhhbXBsZSwgaW5jcmVhc2VkIENPMiBlbWlzc2lvbnMgbWF5IGNhdXNlIGluY3JlYXNlZCB0ZW1wZXJhdHVyZXMgb3IgaW5jcmVhc2VkIHJhdGVzIG9mIGRpc2FzdG9ycy4gSG93ZXZlciwgc2ltcGx5IHNob3dpbmcgYSBzaW1pbGFyIHRyZW5kIG92ZXIgdGltZSBkb2VzIG5vdCBpbiBpdHNlbGYgcHJvdmUgdGhhdCB0d28gdmFyaWFibGVzIGFyZSBjYXVzYWxseSByZWxhdGVkLiBBcyB5b3UgY2FuIHNlZSBmcm9tIHRoaXMgcGxvdCwgb2Z0ZW4gZGF0YSBtYXkgc2hvdyBhIHNpbWlsYXIgcGF0dGVybiBvdmVyIHRpbWUgYnkgcmFuZG9tIGNoYW5jZS4gIFNlZSB0aGlzIFt3ZWJzaXRlXShodHRwczovL3d3dy50eWxlcnZpZ2VuLmNvbS9zcHVyaW91cy1jb3JyZWxhdGlvbnMpe3RhcmdldD0iX2JsYW5rIn0gZm9yIG1vcmUgZXhhbXBsZXMuCgpgYGB7ciwgZWNobyA9IEZBTFNFLCBvdXQud2lkdGg9IjUwMHB4In0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoaGVyZTo6aGVyZSgiaW1nIiwgImNhdXNhdGlvbi5wbmciKSkKYGBgCgoKCgojICoqV2hhdCBhcmUgdGhlIGRhdGE/KioKKioqIAoKSW4gdGhpcyBjYXNlIHN0dWR5IHdlIHdpbGwgYmUgdXNpbmcgZGF0YSByZWxhdGVkIHRvIENPMiBlbWlzc2lvbnMsIGFzIHdlbGwgYXMgb3RoZXIgZGF0YSB0aGF0IG1heSBpbmZsdWVuY2UsIGJlIGluZmx1ZW5jZWQgb3IgcmVsYXRlIHRvIENPMiBlbWlzc2lvbnMuIE1vc3Qgb2Ygb3VyIGRhdGEgd2FzIG9idGFpbmVkIGZyb20gW0dhcG1pbmRlcl0oaHR0cHM6Ly93d3cuZ2FwbWluZGVyLm9yZy9kYXRhLyl7dGFyZ2V0PSJfYmxhbmsifSwgd2hpY2ggaXMgYSB1bmlxdWUgbm9ucHJvZml0IHRoYXQgcHJvdmlkZXMgYSB2YXJpZXR5IG9mIGRhdGEgZm9yIGZyZWUuCgpJbiB0aGVpciB3b3JkcywgR2FwbWluZGVyIGlzLi4uCgo+IEdhcG1pbmRlciBpcyBhbiBpbmRlcGVuZGVudCBTd2VkaXNoIGZvdW5kYXRpb24gd2l0aCBubyBwb2xpdGljYWwsIHJlbGlnaW91cyBvciBlY29ub21pYyBhZmZpbGlhdGlvbnMuIEdhcG1pbmRlciBpcyBhIGZhY3QgdGFuaywgbm90IGEgdGhpbmsgdGFuay4gR2FwbWluZGVyIGZpZ2h0cyBkZXZhc3RhdGluZyBtaXNjb25jZXB0aW9ucyBhYm91dCBnbG9iYWwgZGV2ZWxvcG1lbnQuIEdhcG1pbmRlciBwcm9kdWNlcyBmcmVlIHRlYWNoaW5nIHJlc291cmNlcyBtYWtpbmcgdGhlIHdvcmxkIHVuZGVyc3RhbmRhYmxlIGJhc2VkIG9uIHJlbGlhYmxlIHN0YXRpc3RpY3MuIEdhcG1pbmRlciBwcm9tb3RlcyBhIGZhY3QtYmFzZWQgd29ybGR2aWV3IGV2ZXJ5b25lIGNhbiB1bmRlcnN0YW5kLiAgR2FwbWluZGVyIGNvbGxhYm9yYXRlcyB3aXRoIHVuaXZlcnNpdGllcywgVU4sIHB1YmxpYyBhZ2VuY2llcyBhbmQgbm9uLWdvdmVybm1lbnRhbCBvcmdhbml6YXRpb25zLiBBbGwgR2FwbWluZGVyIGFjdGl2aXRpZXMgYXJlIGdvdmVybmVkIGJ5IHRoZSBib2FyZC4gV2UgZG8gbm90IGF3YXJkIGdyYW50cy4gR2FwbWluZGVyIEZvdW5kYXRpb24gaXMgcmVnaXN0ZXJlZCBhdCBTdG9ja2hvbG0gQ291bnR5IEFkbWluaXN0cmF0aW9uIEJvYXJkLiBPdXIgY29uc3RpdHV0aW9uIGNhbiBiZSBmb3VuZCBbaGVyZV0oaHR0cHM6Ly93d3cuZ2FwbWluZGVyLm9yZy9hYm91dC1nYXBtaW5kZXIvY29uc3RpdHV0aW9uLykuCgpUaGUgZGF0YSB0aGF0IHdlIHdpbGwgYmUgdXNpbmcgZnJvbSBHYXBtaW5kZXIgd2FzIG9idGFpbmVkIGZyb20gdGhlIFtXb3JsZCBCYW5rXShodHRwczovL3d3dy53b3JsZGJhbmsub3JnL2VuL3doYXQtd2UtZG8pe3RhcmdldD0iX2JsYW5rIn0uCgoKSW4gYWRkaXRpb24gd2Ugd2lsbCB1c2Ugc29tZSBkYXRhIHRoYXQgaXMgc3BlY2lmaWMgdG8gdGhlIFVuaXRlZCBTdGF0ZXMgZnJvbSB0aGUgW05hdGlvbmFsIE9jZWFuaWMgYW5kIEF0bW9zcGhlcmljIEFkbWluaXN0cmF0aW9uIChOT0FBKV0gKGh0dHBzOi8vd3d3Lm5vYWEuZ292LyksIHdoaWNoIGlzIGFuIGFnZW5jeSB0aGF0IGNvbGxlY3RzIHdlYXRoZXIgYW5kIGNsaW1hdGUgZGF0YS4KCgpEYXRhICAgfCBUaW1lIHNwYW4gfCBTb3VyY2UgIHwgT3JnaW5hbCBTb3VyY2UgICB8IERlc2NyaXB0aW9uIHwgQ2l0YXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotLS0tLS0tLS0tIHwtLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLXwtLS0tLS0tLXwtLS0tLS0tCioqQ08yIGVtaXNzaW9ucyoqICB8MTc1MSB0byAyMDE0IHwgW0dhcG1pbmRlcl0oaHR0cHM6Ly93d3cuZ2FwbWluZGVyLm9yZy9kYXRhLyl7dGFyZ2V0PSJfYmxhbmsifSAgfCBbQ2FyYm9uIERpb3hpZCBJbmZvcm1hdGlvbiBBbmFseXNpcyBDZW50ZXIgKENESUFDKV0oaHR0cHM6Ly9jZGlhYy5lc3MtZGl2ZS5sYmwuZ292Lyl7dGFyZ2V0PSJfYmxhbmsifSAgfCAgQ08yIGVtaXNzaW9ucyBpbiB0b25uZXMgb3IgbWV0cmljIHRvbnMgKGVxdWl2YWxlbnQgdG8gYXBwcm94aW1hdGVseSAyLDIwNC42IHBvdW5kcykgcGVyIHBlcnNvbiBieSBjb3VudHJ5fCBOQQoqKkdEUCBwZXIgY2FwaXRhLCBwZXJjZW50IHllYXJseSBncm93dGgqKiB8IDE4MDEgdG8gMjAxOXwgW0dhcG1pbmRlcl0oaHR0cHM6Ly93d3cuZ2FwbWluZGVyLm9yZy9kYXRhLyl7dGFyZ2V0PSJfYmxhbmsifSAgfCBbV29ybGQgQmFua10oaHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcvaW5kaWNhdG9yL05ZLkdEUC5QQ0FQLktELlpHKXt0YXJnZXQ9Il9ibGFuayJ9ICB8ICBbR3Jvd3RoIERvbWVzdGljIFByb2R1Y3RdKGh0dHBzOi8vd3d3LmludmVzdG9wZWRpYS5jb20vdGVybXMvZy9nZHAuYXNwIzp+OnRleHQ9R3Jvc3MlMjBEb21lc3RpYyUyMFByb2R1Y3QlMjAoR0RQKSUyMGlzJTIwdGhlJTIwbW9uZXRhcnklMjB2YWx1ZSUyMG9mJTIwYWxsLGV4cGVuZGl0dXJlcyUyQyUyMHByb2R1Y3Rpb24lMkMlMjBvciUyMGluY29tZXMuKXt0YXJnZXQ9Il9ibGFuayJ9ICAod2hpY2ggaXMgYW4gb3ZlcmFsbCBtZWFzdXJlIG9mIHRoZSBoZWFsdGggb2YgbmF0aW9uJ3MgZWNvbm9teSkgcGVyIHBlcnNvbiBieSBjb3VudHJ5fCBOQQoqKkVuZXJneSB1c2UgcGVyIHBlcnNvbioqIHwxOTYwIHRvIDIwMTUgfCBbR2FwbWluZGVyXShodHRwczovL3d3dy5nYXBtaW5kZXIub3JnL2RhdGEvKXt0YXJnZXQ9Il9ibGFuayJ9ICB8IFtXb3JsZCBCYW5rXShodHRwczovL2RhdGEud29ybGRiYW5rLm9yZy9pbmRpY2F0b3IvRUcuVVNFLlBDQVAuS0cuT0Upe3RhcmdldD0iX2JsYW5rIn0gIHwgIFVzZSBvZiBwcmltYXJ5IGVuZXJneSBiZWZvcmUgdHJhbnNmb3JtYXRpb24gdG8gb3RoZXIgZW5kLXVzZSBmdWxlcywgYnkgY291bnRyeSB8IE5BCioqQ3J1ZGUgTW9ydGFsaXR5IFJhdGUqKiB8MTk2MCB0byAyMDE4IHwgW1dvcmxkIEJhbmtdKGh0dHBzOi8vZGF0YS53b3JsZGJhbmsub3JnL2luZGljYXRvci9TUC5EWU4uQ0RSVC5JTil7dGFyZ2V0PSJfYmxhbmsifSAgfCBbV29ybGQgQmFua10oaHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcvaW5kaWNhdG9yL1NQLkRZTi5DRFJULklOKXt0YXJnZXQ9Il9ibGFuayJ9IHwgIERlYXRoIHJhdGUgcGVyIDEsMDAwIHBlb3BsZSBieSBjb3VudHJ5IHwgTkEgCioqVVMgTmF0dXJhbCBEaXNhc3RlcnMqKiB8IDE5ODAgdG8gMjAxOSB8IFtUaGUgTmF0aW9uYWwgT2NlYW5pYyBhbmQgQXRtb3NwaGVyaWMgQWRtaW5pc3RyYXRpb24gKE5PQUEpXShodHRwczovL3d3dy5uY2RjLm5vYWEuZ292L2JpbGxpb25zL3RpbWUtc2VyaWVzKXt0YXJnZXQ9Il9ibGFuayJ9fCBbVGhlIE5hdGlvbmFsIE9jZWFuaWMgYW5kIEF0bW9zcGhlcmljIEFkbWluaXN0cmF0aW9uIChOT0FBKSBdKGh0dHBzOi8vd3d3Lm5jZGMubm9hYS5nb3YvYmlsbGlvbnMvdGltZS1zZXJpZXMpe3RhcmdldD0iX2JsYW5rIn18ICBVUyBkYXRhIGFib3V0OiA8YnI+IC0tIERyb3VnaHRzIDxicj4gLS0gRmxvb2RzIDxicj4gLS0gRnJlZXplcyA8YnI+IC0tIFNldmVyZSBTdG9ybXMgPGJyPiAtLSBUcm9waWNhbCBDeWNsb25lcyA8YnI+IC0tIFdpbGRmaXJlczxicj4gLS0gV2ludGVyIFN0b3JtcyB8IE5PQUEgTmF0aW9uYWwgQ2VudGVycyBmb3IgRW52aXJvbm1lbnRhbCBJbmZvcm1hdGlvbiAoTkNFSSkgVS5TLiBCaWxsaW9uLURvbGxhciBXZWF0aGVyIGFuZCBDbGltYXRlIERpc2FzdGVycyAoMjAyMCkuIGh0dHBzOi8vd3d3Lm5jZGMubm9hYS5nb3YvYmlsbGlvbnMvLCBET0k6IDEwLjI1OTIxL3N0a3ctN3c3MwoqKlRlbXBlcmF0dXJlKiogIHwgMTg5NSB0byAyMDE5fCAgW1RoZSBOYXRpb25hbCBPY2VhbmljIGFuZCBBdG1vc3BoZXJpYyBBZG1pbmlzdHJhdGlvbiAoTk9BQSldKGh0dHBzOi8vd3d3Lm5jZGMubm9hYS5nb3YvY2FnL25hdGlvbmFsL3RpbWUtc2VyaWVzKXt0YXJnZXQ9Il9ibGFuayJ9ICB8IFtUaGUgTmF0aW9uYWwgT2NlYW5pYyBhbmQgQXRtb3NwaGVyaWMgQWRtaW5pc3RyYXRpb24gKE5PQUEpXShodHRwczovL3d3dy5uY2RjLm5vYWEuZ292L2NhZy9uYXRpb25hbC90aW1lLXNlcmllcyl7dGFyZ2V0PSJfYmxhbmsifSB8IFVTIE5hdGlvbmFsIHllYXJseSBhdmVyYWdlIHRlbXBlcmF0dXJlIChpbiBGYWhyZW5oZWl0KSBmcm9tIDE4OTUgdG8gMjAxOSB8IE5PQUEgTmF0aW9uYWwgQ2VudGVycyBmb3IgRW52aXJvbm1lbnRhbCBpbmZvcm1hdGlvbiwgQ2xpbWF0ZSBhdCBhIEdsYW5jZTogTmF0aW9uYWwgVGltZSBTZXJpZXMsIHB1Ymxpc2hlZCBKdW5lIDIwMjAsIHJldHJpZXZlZCBvbiBKdW5lIDI2LCAyMDIwIGZyb20gaHR0cHM6Ly93d3cubmNkYy5ub2FhLmdvdi9jYWcvCgoKVG8gb2J0YWluIHRoZSB0ZW1wZXJhdHVyZSBkYXRhLCBhbm51YWwgYXZlcmFnZSB0ZW1wZXJhdHVyZXMgd2VyZSBzZWxlY3RlZCBhcyBzaG93biBpbiB0aGlzIGltYWdlOgpgYGB7ciwgZWNobyA9IEZBTFNFLCBvdXQud2lkdGggPSAiODAwIHB4In0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoaGVyZTo6aGVyZSgiaW1nIiwgInRlbXAucG5nIikpCmBgYAoKCkltcG9ydGFudGx5LCBub3RpY2UgdGhhdCB0aGUgZGF0YSB3ZSB3b3VsZCBsaWtlIHRvIHVzZSBzcGFuIGRpZmZlcmVudCB0aW1lIHBlcmlvZHM6CgpEYXRhICAgfCBUaW1lIHNwYW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLS0tLS0tLS0tLSB8LS0tLS0tLS0tLS0tLQoqKkNPMiBlbWlzc2lvbnMqKiAgfDE3NTEgdG8gMjAxNCAKKipHRFAgcGVyIGNhcGl0YSwgeWVhcmx5IGdyb3d0aCoqIHwgMTgwMSB0byAyMDE5CioqRW5lcmd5IHVzZSBwZXIgcGVyc29uKiogfDE5NjAgdG8gMjAxNSAKKipDcnVkZSBNb3J0YWxpdHkgUmF0ZSoqIHwxOTYwIHRvIDIwMTggCioqVVMgTmF0dXJhbCBEaXNhc3RlcnMqKiB8IDE5ODAgdG8gMjAxOSAKKipUZW1wZXJhdHVyZSoqICB8IDE4OTUgdG8gMjAxOQoKCgoKIyAqKkRhdGEgSW1wb3J0KioKKioqIAoKVG8gcmVhZCBpbiB0aGUgZmlsZXMgdGhhdCB3ZXJlIGRvd25sb2FkZWQgZnJvbSB0aGUgdmFyaW91cyBzb3VyY2VzIGFzIGluZGljYXRlZCBpbiB0aGUgdGFibGUgYWJvdmUsIHdlIHdpbGwgdXNlIHRoZSBgcmVhZF94bHN4KClgIGFuZCBgcmVhZF94bHMoKWAgZnVuY3Rpb25zIG9mIHRoZSBgcmVhZHhsYCBwYWNrYWdlIHRvIGltcG9ydCB0aGUgZGF0YSBmcm9tIHRoZSAueGxzeCBhbmQgLnhscyBmaWxlcyByZXNwZWN0aXZlbHkgYW5kIHdlIHdpbGwgdXNlIHRoZSBgcmVhZF9jc3ZgIGZ1bmN0aW9uIG9mIHRoZSBgcmVhZHJgIHBhY2thZ2UgdG8gaW1wb3J0IHRoZSBkYXRhIGZyb20gdGhlIGNzdiBmaWxlcy4KCmBgYHtyfQojIHhsc3ggZmlsZXM6CkNPMl9lbWlzc2lvbnMgPC0gcmVhZHhsOjpyZWFkX3hsc3goaGVyZSgiZG9jcy95ZWFybHlfY28yX2VtaXNzaW9uc18xMDAwX3Rvbm5lcy54bHN4IikpCmdkcF9ncm93dGggPC0gcmVhZHhsOjpyZWFkX3hsc3goaGVyZSgiZG9jcy9nZHBfcGVyX2NhcGl0YV95ZWFybHlfZ3Jvd3RoLnhsc3giKSkKZW5lcmd5X3VzZSA8LSByZWFkeGw6OnJlYWRfeGxzeChoZXJlKCJkb2NzL2VuZXJneV91c2VfcGVyX3BlcnNvbi54bHN4IikpCgojIHhscyBmaWxlOgptb3J0YWxpdHkgPC0gcmVhZHhsOjpyZWFkX3hscyhoZXJlKCJkb2NzL0FQSV9TUC5EWU4uQ0RSVC5JTl9EUzJfZW5fZXhjZWxfdjJfODA0Mzg0LnhscyIpKQpgYGAKCkZvciBvdXIgY3N2IGRhdGEgZmlsZXMsIHRoZXJlIGFyZSBzb21lIGxpbmVzIHRoYXQgd2Ugd291bGQgbGlrZSB0byBub3QgaW1wb3J0IC0gaW5mYWN0LCB3ZSB3aWxsIGdldCBhbiBlcnJvciBpZiB3ZSB0cnkgdG8gaW1wb3J0IHRoZW0gYmVjYXVzZSBvdXIgdGFibGUgc3RydWN0dXJlIHdpbGwgYmUgYXMgciBleHBlY3RzLiBXZSBjYW4gZG8gc28gdXNpbmcgdGhlIGBza2lwID1gIGFyZ3VtZW50IG9mIHRoZSBgcmVhZF9jc3YoKWAgZnVuY3Rpb24uIAoKSGVyZSB5b3UgY2FuIHNlZSB0aGF0IHRoZSBmaXJzdCB0d28gcm93cyBvZiB0aGUgZGF0YSBhYm91dCBVUyBEaXNhc3RlcnMgZG9lc24ndCBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiBjb2x1bW5zIGFzIHRoZSBzdWJzZXF1ZW50IHJvd3MuIFNvIHdlIHdhbnQgdG8gc2tpcCB0aGVzZSBmaXJzdCB0d28gbGluZXMsIHdlIHdpbGwgdXNlIGBza2lwID0gMmAgZm9yIHRoaXMuCgpgYGB7ciwgZWNobyA9IEZBTFNFLCBvdXQud2lkdGggPSAiODAwIHB4In0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoaGVyZTo6aGVyZSgiaW1nIiwgIkRpc2FzdGVycy5wbmciKSkKYGBgCk5vdyBsb29raW5nIGF0IHRoZSB0ZW1wZXJhdHVyZSBkYXRhLCB3ZSBjYW4gc2VlIHRoYXQgIHRoZSBmaXJzdCBmb3VyIGxpbmVzIGRvIG5vdCBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiBjb2x1bW5zIGFzIHRoZSBzdWJzZXF1ZW50IGxpbmVzLiBXZSB3aWxsIHNraXAgaW1wb3J0aW5nIGFsbCA0IGxpbmVzIGJ5IHVzaW5nIGBza2lwID0gNGAuIFdlIGNhbiBhbHNvIHNwZWNpZnkgdGhhdCBgTkFgIHZhbHVlcyBhcmUgZW5jb2RlZCBhcyBgIi05OSJgLiBUaGlzIHdpbGwgcmVwbGFjZSBhbGwgaW5zdGFuY2VzIG9mIGAiLTk5ImAgd2l0aCBgTkFgLiBXZSBjYW4gZG8gdGhpcyB1c2luZyB0aGUgYG5hID0gYCBhcmd1bWVudCBvZiB0aGUgYHJlYWRfY3N2KClgIGZ1bmN0aW9uLiBXZSB3aWxsIGRvIHNvIGFzOiBgbmEgPSAiLTk5ImAuIFRoZSAiLTk5IiBuZWVkcyB0byBiZSBpbiBxdW90YXRpb24gbWFya2VzIGJlY3Vhc2UgdGhpcyBhcmd1bWVudCBleHBlY3RzIGNoYXJhY3RlcnMuCgpgYGB7ciwgZWNobyA9IEZBTFNFLCBvdXQud2lkdGggPSAiODAwIHB4In0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoaGVyZTo6aGVyZSgiaW1nIiwgInRlbXBkYXRhLnBuZyIpKQpgYGAKCmBgYHtyfQojY3N2IGZpbGVzOgp1c19kaXNhc3RlciA8LSByZWFkcjo6cmVhZF9jc3YoaGVyZSgiZG9jcy90aW1lLXNlcmllcy1VUy5jc3YiKSwgc2tpcCA9IDIpCnVzX3RlbXBlcmF0dXJlIDwtIHJlYWRyOjpyZWFkX2NzdihoZXJlKCJkb2NzL3RlbXBlcmF0dXJlLmNzdiIpLCBza2lwID0gNCwgbmEgPSItOTkiKQptb3J0YWxpdHkyIDwtcmVhZHI6OnJlYWRfY3N2KGhlcmUoImRvY3MvbW9ydGFsaXR5LmNzdiIpLCBza2lwID0gNSkKYGBgCgpHcmVhdCEgbm93IHdlIGhhdmUgaW1wb3J0ZWQgYWxsIG9mIHRoZSBkYXRhIHRoYXQgd2Ugd2lsbCBuZWVkLgoKCiMgKipEYXRhIFdyYW5nbGluZyoqCioqKiAKCk5vdyB3ZSB3aWxsIHRha2UgYSBsb29rIGF0IG91ciBkYXRhIGFuZCB3cmFuZ2xlIGl0IHVudGlsIGl0IGlzIGVhc3kgdG8gdXNlIHRvIGFsbG93IHVzIHRvIGV2YWx1YXRlIGhvdyBDTzIgZW1pc3Npb25zIGhhdmUgY2hhbmdlZCBvdmVyIHRpbWUgYW5kIGhvdyBlbWlzc2lvbnMgbWF5IHJlbGF0ZSB0byBlbmVyZ3kgdXNlLCBtb3J0YWxpdHksIEdEUCBldGMuIAoKIyMgWWVhcmx5IENPfjJ+IEVtaXNzaW9ucwoKRmlyc3QgbGV0J3MgdGFrZSBhIGxvb2sgYXQgdGhlIENPMiBkYXRhLiBXZSBjYW4gdXNlIHRoZSBiYXNlIGBzbGljZV9oZWFkKClgIGZ1bmN0aW9uIG9mIHRoZSBgZHBseXJgIHBhY2thZ2UgdG8gc2VlIGp1c3QgdGhlIGZpcnN0IHJvd3Mgb2Ygb3VyIGRhdGEuIFdlIGNhbiBzcGVjaWZ5IGhvdyBtYW55IHJvd3Mgd2Ugd291bGQgbGlrZSB0byBzZWUgYnkgdXNpbmcgdGhlIGBuID1gIGFyZ3VtZW50LiBJdCBpcyBhbHNvIHVzZWZ1bCB0byB1c2UgdGhlIGBzbGljZV9zYW1wbGUoKWAgZnVuY3Rpb24gdG8gbG9vayBhdCBhIHNlbGVjdGlvbiBvZiByYW5kb20gcm93cy4KCldlIHdpbGwgdXNlIHRoZSBgJT4lYCBwaXBlIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGRlZmluZSB0aGUgaW5wdXQgZm9yIGxhdGVyIHNlcXVlbnRpYWwgc3RlcHMuIFRoaXMgd2lsbCBtYWtlIG1vcmUgc2Vuc2Ugd2hlbiB3ZSBoYXZlIG11bHRpcGxlIHNlcXVlbnRpYWwgc3RlcHMgdXNpbmcgdGhlIHNhbWUgZGF0YSBvYmplY3QuIFRvIHVzZSB0aGUgcGlwZSBub3RhdGlvbiB3ZSBuZWVkIHRvIGluc3RhbGwgYW5kIGxvYWQgIHRoZSBgZHBseXJgIHBhY2thZ2UuCgpgYGB7cn0KQ08yX2VtaXNzaW9ucyAlPiUKICBzbGljZV9oZWFkKG4gPSA2KQoKQ08yX2VtaXNzaW9ucyAlPiUKICBzbGljZV9zYW1wbGUobiA9IDEwKQpgYGAKCk9LLCB3ZSBjYW4gc2VlIHRoYXQgb3VyIGNvdW50cnkgZGF0YSBtYWtlcyBvZiB0aGUgcm93cyBhbmQgdGhlIHllYXJseSBkYXRhIG1ha2VzIHVwIHRoZSBjb2x1bW5zLiBXZSBhbHNvIHNlZSB0aGF0IHdlIGhhdmUgYWxvdCBvZiBgTkFgIHZhbHVlcy4KCgpXZSBjYW4gYWxzbyB1c2UgdGhlIGBnbGltcHNlKClgIGZ1bmN0aW9uIG9mIHRoZSBgZHBseXJgIHBhY2tnZSB0byB2aWV3IG91ciBkYXRhLiBUaGlzIGFsbG93cyB1cyB0byBzZWUgbW9yZSBvZiBvdXIgZGF0YSBhdCBvbmNlLiBXZSB3aWxsIHNlZSBhIHRpbnkgYml0IG9mIGVhY2ggdmFyaWFibGUvY29sdW1uLiBUbyBkbyBzbyBvdXIgZGF0YSB3aWxsIGJlIGRpc3BsYXllZCB3aXRoIHRoZSBjb2x1bW4gbmFtZXMgbGlzdGVkIG9uIHRoZSByaWdodC4KCiMjIyMgey5zY3JvbGxhYmxlIH0KYGBge3J9CiMgU2Nyb2xsIHRocm91Z2ggdGhlIG91dHB1dCEKQ08yX2VtaXNzaW9ucyAlPiUKZHBseXI6OmdsaW1wc2UoKQpgYGAKIyMjIwoKCgpXZSBjYW4gc2VlIHRoYXQgd2UgaGF2ZSBhIGxhcmdlIFt0aWJibGVdKGh0dHBzOi8vdGliYmxlLnRpZHl2ZXJzZS5vcmcvKS4gQSB0aWJibGUgaXMgdGhlIHRpZHl2ZXJzZSB2ZXJzaW9uIG9mIGEgZGF0YSBmcmFtZS4gSXQgaXMgZXNzZW50aWFsbHkgYSB0YWJsZSB3aXRoIHZhcmlhYmxlIGluZm9ybWF0aW9uIGFycmFuZ2VkIGFzIGNvbHVtbnMsIGFuZCBpbmRpdmlkdWFsIG9ic2VydmF0aW9ucyBhcnJhbmdlZCBhcyByb3dzLiBXZSBjYW4gc2VlIHRoYXQgdGhlIHRpYmJsZSBnaXZlcyB1cyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY2xhc3Mgb2YgZWFjaCB2YXJpYWJsZS4gIEZvciBleGFtcGxlIHRoZSBgY291bnRyeWAgdmFyaWFibGUgaXMgbWFkZSB1cCBvZiBjaGFyYWN0ZXIgKGFiYnJldmlhdGVkIGFzIGNocikgdmFsdWVzLiBXZSBzZWUgdGhhdCB3ZSBoYXZlIDI2NSBkaWZmZXJlbnQgY291bnRyeSB2YXJpYWJsZXMgYW5kIENPMiBlbWlzc2lvbiB2YWx1ZXMgZm9yIDE5MiBkaWZmZXJlbnQgeWVhcnMgKGZyb20gMTc1MSB0byAyMDE0KS4gUmVjYWxsIHRoYXQgdGhlIHZhbHVlcyBhcmUgZW1pc3Npb25zIGluIG1ldHJpYyB0b25zIGFsc28gY2FsbGVkIHRvbm5lcy4gV2UgY2FuIHNlZSB0aGF0IHRoZXJlIGFyZSBmZXdlciBgTkFgIHZhbHVlcyBmb3IgbGF0ZXIgeWVhcnMuCgpOb3cgd2Ugd2lsbCBtb2RpZnkgdGhpcyBkYXRhIHRvIG1ha2UgaXQgbW9yZSB1c2FibGUgZm9yIG1ha2luZyB2aXN1YWxpemF0aW9ucy4gT25lIHRoaW5nIHdlIHdpbGwgdXNlIGlzIHRoZSBgJTw+JWAgb3BwZXJhdG9yIHdoaWNoIGlzIGZyb20gdGhlIGBtYWdyaXR0cmAgcGFja2FnZS4gVGhpcyBhbGxvd3MgdXMgdG8gdXNlIG91ciBgQ08yX2VtaXNzaW9uc2AgZGF0YSBhbmQgcmVhc3NpZ24gaXQgdG8gYSBtb2RpZmllZCB2ZXJzaW9uIGF0IHRoZSBzYW1lIHRpbWUuIAoKV2Ugd2lsbCB1c2UgdGhlIGBwaXZvdF9sb25nZXIoKWAgZnVuY3Rpb24gb2YgdGhlIGBkcGx5cmAgcGFja2FnZSB0byBjb252ZXJ0IG91ciBkYXRhIGludG8gd2hhdCBpcyBjYWxsZWQgbG9uZyBmb3JtYXQuIFRoaXMgbWVhbnMgdGhhdCB3ZSB3aWxsIGhhdmUgbW9yZSByb3dzIGFuZCBmZXdlciBjb2x1bW5zIHRoYW4gb3VyIGN1cnJlbnQgZm9ybWF0LiBUaGlzIGlzIGRvbmUgYnkgY29sbGFwc2luZyBtdWx0aXBsZSB2YXJpYWJsZXMgaW50byBmZXdlciB2YXJpYWJsZXMuCgpXZSB3YW50IHRvIGNvbGxhcHNlIGFsbCBvZiB0aGUgdmFsdWVzIGZvciB0aGUgZW1pc3Npb24gZGF0YSBhY3Jvc3MgdGhlIGRpZmZlcmVudCBpbmRpdmlkdWFsIHllYXIgdmFyaWFibGVzIGludG8gb25lIG5ldyBlbWlzc2lvbiB2YXJpYWJsZSBhbmQgd2Ugd2lsbCBpZGVudGlmeSB3aGF0IHllYXIgdGhleSBhcmUgZnJvbSB1c2luZyBhIG5ldyBgWWVhcmAgdmFyaWFibGUuCgpgYGB7cn0KQ08yX2VtaXNzaW9ucyAgJTw+JQogIHBpdm90X2xvbmdlcihjb2xzID0gLWNvdW50cnksIG5hbWVzX3RvID0gIlllYXIiLCB2YWx1ZXNfdG8gPSAiRW1pc3Npb25zIikKCkNPMl9lbWlzc2lvbnMgJT4lCiAgc2xpY2Vfc2FtcGxlKG4gPSA2KQpgYGAKCldlIGFsc28gd2FudCB0byByZW5hbWUgdGhlIGBjb3VudHJ5YCB2YXJpYWJsZSB0byBiZSBjYXBpdGFsaXplZC4gIFdlIGNhbiB1c2UgdGhlIGByZW5hbWUoKWAgZnVuY3Rpb24gb2YgdGhlIGBkcGx5cmAgcGFja2FnZSB0byByZW5hbWUgdGhpcyB2YXJpYWJsZS4gV2hlbiByZW5hbWluZyB2YXJpYWJsZXMgdGhlIG5ldyBuYW1lIGlzIGxpc3RlZCBmaXJzdCBiZWZvcmUgdGhlIGA9YC4gV2Ugd2lsbCBhbHNvIG1vZGlmeSB0aGUgYEVtaXNzaW9uc2AgZGF0YSBieSBkaXZpZGluZyBpdCBieSAxMDAwIHRvIG1ha2UgdGhlIG51bWJlcnMgc21hbGxlci4gVG8gZG8gdGhpcyB3ZSB3aWxsIHVzZSB0aGUgYG11dGF0ZSgpYCBmdW5jdGlvbiwgd2hpY2ggaXMgYWxzbyBwYXJ0IG9mIHRoZSBgZHBseXIoKWAgcGFja2FnZS4gVGhpcyBmdW5jdGlvbiBhbGxvd3MgdXMgdG8gY3JlYXRlIGFuZCBtb2RpZnkgdmFyaWFibGVzLiBZb3UgbWF5IGFsc28gbm90ZSB0aGF0IHRoZSBgWWVhcmAgdmFyaWFibGUgaXMgY3VycmVudGx5IG9mIGNsYXNzIHR5cGUgY2hhcmFjdGVyLiBXZSB3b3VsZCBsaWtlIHRvIGNoYW5nZSBpdCB0byBiZSBudW1lcmljLiBUaGlzIGNhbiBhbHNvIGJlIGFjY29tcGxpc2hlZCB1c2luZyB0aGUgYG11dGF0ZSgpYCBmdW5jdGlvbi4KCmBgYHtyfQogIAogQ08yX2VtaXNzaW9ucyAgJTw+JSAKICAgZHBseXI6OnJlbmFtZShDb3VudHJ5PWNvdW50cnkpICU+JQojICAgZHBseXI6Om11dGF0ZShFbWlzc2lvbnMgPSBFbWlzc2lvbnMvMTAwMCwgCiAgICAgICAgIGRwbHlyOjptdXRhdGUoWWVhciA9IGFzLm51bWVyaWMoWWVhciksCiAgICAgICAgICBMYWJlbCA9ICJDTzIgRW1pc3Npb25zIChNZXRyaWMgVG9ucykiKQogICAgICNyZW5hbWUoYENPMiBFbWlzc2lvbnMgKE1nKWA9IEVtaXNzaW9ucykKCmBgYAoKTm93IGxldCdzIHRha2UgYSBsb29rIHRvIHNlZSBob3cgb3VyIGRhdGEgaGFzIGNoYW5nZWQ6CgpgYGB7cn0KCkNPMl9lbWlzc2lvbnMgJT4lCnNsaWNlX3NhbXBsZShuID0gNikKCmBgYApHcmVhdCwgd2UgY2FuIHNlZSB0aGF0IG5vdyB0aGUgYFllYXJgIHZhcmlhYmxlIGlzIG9mIGNsYXNzIGRvdWJsZSAoYWJicmV2aWF0ZWQgYGRibGApLCB3aGljaCBpcyBhIG51bWVyaWMgY2xhc3MuCgoKTm93IGxldCdzIHRha2UgYSBsb29rIGF0IHRoZSBgQ291bnRyeWAgdmFyaWFibGUganVzdCB0byBjaGVjayBpZiB0aGVyZSBpcyBhbnl0aGluZyB1bmV4cGVjdGVkLiBXZSB3aWxsIHVzZSB0aGUgYGRpc3RpbmN0KClgIGZ1bmN0aW9uIG9mIHRoZSBgZHBseXJgIHBhY2thZ2UgdG8gdmlldyB0aGUgdW5pcXVlIHZhbHVlcyBvbmx5LgoKIyMjIyB7LnNjcm9sbGFibGUgfQpgYGB7cn0KI1Njcm9sbCB0aHJvdWdoIHRoZSBvdXRwdXQhCkNPMl9lbWlzc2lvbnMgJT4lCiAgICAgICBkaXN0aW5jdChDb3VudHJ5KQoKYGBgCiMjIyMKClRoZXNlIGFsbCBsb29rIGFzIGV4cGVjdGVkIQoKCiMjIFllYXJseSBHcm93dGggaW4gR0RQIHBlciBDYXBpdGEKCmBgYHtyfQpnZHBfZ3Jvd3RoICU+JQogIHNsaWNlX2hlYWQobiA9IDYpCmBgYAoKYGBge3J9Cm5hbWVzKGdkcF9ncm93dGgpCmBgYAoKIyMjIyB7LnNjcm9sbGFibGV9CmBgYHtyfQojIFNjcm9sbCB0aHJvdWdoIHRoZSBvdXRwdXQhCmdkcF9ncm93dGggJT4lCmdsaW1wc2UoKQpgYGAKIyMjIwoKQWdhaW4sIHdlIHdpbGwgdXNlIHRoZSBgcGl2b3RfbG9uZ2VyKClgIHRvIHRyYW5zZm9ybSB0aGUgZGF0YSB0byBsb25nIGZvcm1hdC4gV2Ugd2lsbCBhbHNvIGFnYWluIGNoYW5nZSB0aGUgYGNvdW50cnlgIHZhcmlhYmxlIHRvIGJlIGBDb3VudHJ5YCBieSB1c2luZyB0aGUgYHJlbmFtZSgpYCBmdW5jdGlvbiAsIGFuZCB3ZSB3aWxsIG1ha2UgdGhlIGBZZWFyYCB2YXJhaWJsZSBudW1lcmljIHVzaW5nIHRoZSBgbXV0YXRlKClgIGZ1bmN0aW9uLiAKCgoKYGBge3J9CmdkcF9ncm93dGggJTw+JQogIHBpdm90X2xvbmdlcihjb2xzID0gLWNvdW50cnksIAogICAgICAgICAgICAgICBuYW1lc190byA9ICJZZWFyIiwgCiAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJnZHBfZ3Jvd3RoIikgJT4lCiAgcmVuYW1lKENvdW50cnk9Y291bnRyeSkgJT4lCiAgbXV0YXRlKFllYXIgPSBhcy5udW1lcmljKFllYXIpLAogICAgICAgICBMYWJlbCA9ICJHRFAgR3Jvd3RoL0NhcGl0YSAoJSkiKSAlPiUKICByZW5hbWUoR0RQID0gZ2RwX2dyb3d0aCkKYGBgCgpOb3cgbGV0J3Mgc2VlIGhvdyB0aGlzIGRhdGEgaGFzIGNoYW5nZWQ6CgpgYGB7cn0KZ2RwX2dyb3d0aCAlPiUKICBzbGljZV9oZWFkKG4gPSA2KQoKZ2RwX2dyb3d0aCAlPiUKICBjb3VudChZZWFyKQpgYGAKCgpBZ2FpbiBsZXQncyBjaGVjayB0aGF0IHRoZSBgQ291bnRyeWAgdmFyaWFibGUgb25seSBjb250YWlucyB2YWx1ZXMgd2Ugd291bGQgZXhwZWN0LgoKIyMjIyB7LnNjcm9sbGFibGUgfQpgYGB7cn0KI1Njcm9sbCB0aHJvdWdoIHRoZSBvdXRwdXQhCmdkcF9ncm93dGggJT4lCiAgICAgICBkaXN0aW5jdChDb3VudHJ5KQoKYGBgCiMjIyMKCkFsc28gbG9va3MgZ29vZCEKCiMjIEVuZXJneSBVc2UgcGVyIFBlcnNvbgoKTm93IGxldCdzIHRha2UgYSBsb29rIGF0IHRoZSBlbmVyZ3kgdXNlIHBlciBwZXJzb24gZGF0YToKCmBgYHtyfQplbmVyZ3lfdXNlICU+JQogIHNsaWNlX2hlYWQobiA9IDYpCmBgYAoKIyMjIyB7LnNjcm9sbGFibGV9CmBgYHtyfQplbmVyZ3lfdXNlICU+JQogIGdsaW1wc2UoKQpgYGAKIyMjIwoKVG8gd3JhbmdsZSB0aGUgYGVuZXJneV91c2VgIGRhdGEsIHdlIHdpbGwgYWdhaW4gY29udmVydCB0aGUgZGF0YSB0byBsb25nIGZvcm1hdCwgcmVuYW1lIHNvbWUgdmFyaWFibGVzLCBhbmQgbXV0YXRlIHRoZSBgWWVhcmAgZGF0YSB0byBiZSBudW1lcmljLgoKYGBge3J9CmVuZXJneV91c2UgJTw+JQogIHBpdm90X2xvbmdlcihjb2xzID0gLWNvdW50cnksIAogICAgICAgICAgIG5hbWVzX3RvID0gIlllYXIiLCAKICAgICAgICAgIHZhbHVlc190byA9ICJlbmVyZ3lfdXNlIikgJT4lCiAgcmVuYW1lKENvdW50cnkgPSBjb3VudHJ5KSAlPiUKICBtdXRhdGUoWWVhciA9IGFzLm51bWVyaWMoWWVhciksCiAgICAgICAgIExhYmVsID0gIkVuZXJneSBVc2UgKGtnLCBvaWwtZXEuL2NhcGl0YSkiKSAlPiUKICByZW5hbWUoRW5lcmd5ID0gZW5lcmd5X3VzZSkKCmBgYAoKCmBgYHtyfQplbmVyZ3lfdXNlICU+JQpzbGljZV9zYW1wbGUobiA9IDEwKQpgYGAKCk5vdyB3ZSB3aWxsIGNoZWNrIHRoZSBgQ291bnRyeWAgdmFyaWFibGU6CgojIyMjIHsuc2Nyb2xsYWJsZSB9CmBgYHtyfQojU2Nyb2xsIHRocm91Z2ggdGhlIG91dHB1dCEKZW5lcmd5X3VzZSAlPiUKICAgICAgIGRpc3RpbmN0KENvdW50cnkpCgpgYGAKIyMjIwoKCkxvb2tzIGdvb2QhCgoKIyMgQ3J1ZGUgTW9ydGFsaXR5IFJhdGUKCmBgYHtyfQptb3J0YWxpdHkgJT4lCiAgc2xpY2VfaGVhZChuID0gNikKYGBgCgoKV2UgY2FuIHNlZSB0aGF0IHRoZXJlIGFyZSBhIGNvdXBsZSBvZiBlbXB0eSByb3dzIHdoaWNoIGluZGljYXRlIHdoZW4gdGhlIGRhdGEgd2FzIHVwZGF0ZWQuCldlIGNhbiBhbHNvIHNlZSB0aGF0IHRoZSBjb2x1bW5zIHJlYWxseSBzdGFydCBhdCB0aGUgM3JkIHJvdy4gU28gZmlyc3Qgd2Ugd2lsbCByZXBhY2UgdGhlIGNvbHVtbiBuYW1lcyB3aXRoIHRoZSAzcmQgcm93LiBUaGVuIHdlIHdpbGwgcmVtb3ZlIHRoZSBmaXJzdCAzIHJvd3MuCgpgYGB7cn0KY29sbmFtZXMobW9ydGFsaXR5KQpjb2xuYW1lcyhtb3J0YWxpdHkpIDwtIG1vcnRhbGl0eVszLF0KY29sbmFtZXMobW9ydGFsaXR5KQptb3J0YWxpdHkgPC0gbW9ydGFsaXR5Wy1jKDE6MyksXQpgYGAKCgoKIyMjIyB7LnNjcm9sbGFibGV9CmBgYHtyfQptb3J0YWxpdHkgJT4lCiAgZ2xpbXBzZSgpCgpgYGAKIyMjIwoKClRoYXQgaXMgbG9va2luZyBiZXR0ZXIhIEhvd2V2ZXIsIHdlIGFsc28gd2FudCB0byByZW1vdmUgc29tZSB2YXJpYWJsZXMgbGlrZTogYENvdW50cnkgQ29kZWAsIGBJbmRpY2F0b3IgTmFtZWAsIGFuZCBgSW5kaWNhdG9yIENvZGVgLiBXZSBjYW4gZG8gdGhhdCB1c2luZyB0aGUgYHNlbGVjdCgpYCBmdW5jdGlvIG9mIHRoZSBgZHBseXJgIHBhY2thZ2UuIFdlIGNhbiB1c2UgdGhlIG1pbnVzIHNpZ24gYC1gIHRvIGluZGljYXRlIHdoYXQgdmFyaWFibGVzIHdlIGRvbnQgd2FudCB0byBrZWVwLiBPdGhlcndpc2UsIHdlIHdpbGwgcGVyZm9ybSBzaW1pbGFyIG1vZGlmaWNhdGlvbnMgYXMgd2UgcGVyZm9ybWVkIG9uIHRoZSBvdGhlciBkYXRhc2V0cy4gTm90ZSB0aGF0IHRoZXNlIHZhcmlhYmxlIG5hbWVzIG5lZWQgcXVvdGF0aW9uIG1hcmtzIGFyb3VuZCB0aGVtIGJlY2F1c2UgdGhleSBoYXZlIHNwYWNlcy4gCgpgYGB7cn0KbW9ydGFsaXR5ICU8PiUKICBzZWxlY3QoLSJDb3VudHJ5IENvZGUiLAogICAgICAgICAtIkluZGljYXRvciBOYW1lIiwKICAgICAgICAgLSJJbmRpY2F0b3IgQ29kZSIpICU+JQogIHJlbmFtZShDb3VudHJ5ID0gIkNvdW50cnkgTmFtZSIpICU+JQogIHBpdm90X2xvbmdlcihjb2xzID0gLUNvdW50cnksIAogICAgICAgICAgICAgICBuYW1lc190byA9ICJZZWFyIiwgCiAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJEZWF0aHMiKSAlPiUKICBtdXRhdGUoWWVhciA9IGFzLm51bWVyaWMoWWVhciksCiAgICAgICBEZWF0aHMgPSBhcy5udW1lcmljKERlYXRocyksCiAgICAgICBMYWJlbCA9ICJEZWF0aHMvMTAwMCBQZW9wbGUiKQoKYGBgCgpgYGB7cn0KbW9ydGFsaXR5ICU+JQogIHNsaWNlX2hlYWQobiA9IDYpCmBgYAoKTGV0J3MgY2hlY2sgdGhlIGBDb3VudHJ5YCB2YXJpYWJsZToKCiMjIyMgey5zY3JvbGxhYmxlIH0KYGBge3J9CiNTY3JvbGwgdGhyb3VnaCB0aGUgb3V0cHV0IQptb3J0YWxpdHkgJT4lCiAgICAgICBkaXN0aW5jdChDb3VudHJ5KQoKYGBgCiMjIyMKCk9rLCBpbiB0aGlzIGNhc2UgaXQgbG9va3MgbGlrZSB0aGVyZSBhcmUgc29tZSByZWdpb25zIGluY2x1ZGVkIGFzIHdlbGwsIGxpa2U6CgoiRWFzdCBBc2lhICYgUGFjaWZpYyAoZXhjbHVkaW5nIGhpZ2ggaW5jb21lKSIsICJFYXJseS1kZW1vZ3JhcGhpYyBkaXZpZGVuZCIsICJFYXN0IEFzaWEgJiBQYWNpZmljIiwgIkV1cm9wZSAmIENlbnRyYWwgQXNpYSAoZXhjbHVkaW5nIGhpZ2ggaW5jb21lKSIsICJFdXJvcGUgJiBDZW50cmFsIEFzaWEiLCAiRXVybyBhcmVhIiwgIkZyYWdpbGUgYW5kIGNvbmZsaWN0IGFmZmVjdGVkIHNpdHVhdGlvbnMiLCAiRXVyb3BlYW4gVW5pb24iLCAiSGVhdmlseSBpbmRlYnRlZCBwb29yIGNvdW50cmllcyAoSElQQykiLCAiSUJSRCBvbmx5IiwgIklEQSAmIElCUkQgdG90YWwiLCAiSURBIHRvdGFsIiwgIklEQSBibGVuZCIsICJJREEgb25seSIsICJOb3QgY2xhc3NpZmllZCIsICJMYXRpbiBBbWVyaWNhICYgQ2FyaWJiZWFuIChleGNsdWRpbmcgaGlnaCBpbmNvbWUpIiwgIkxhdGluIEFtZXJpY2EgJiBDYXJpYmJlYW4iLCAiTGVhc3QgZGV2ZWxvcGVkIGNvdW50cmllczogVU4gY2xhc3NpZmljYXRpb24iLCJMb3cgaW5jb21lIiwiIExvd2VyIG1pZGRsZSBpbmNvbWUiLCAiTG93ICYgbWlkZGxlIGluY29tZSIsICJMYXRlLWRlbW9ncmFwaGljIGRpdmlkZW5kIiwgIk1pZGRsZSBFYXN0ICYgTm9ydGggQWZyaWNhIiwgIk1pZGRsZSBpbmNvbWUiLCAiTWlkZGxlIEVhc3QgJiBOb3J0aCBBZnJpY2EgKGV4Y2x1ZGluZyBoaWdoIGluY29tZSkiLCAiTm9ydGggQW1lcmljYSIsICJPRUNEIG1lbWJlcnMiLCAiT3RoZXIgc21hbGwgc3RhdGVzIiwgIlByZS1kZW1vZ3JhcGhpYyBkaXZpZGVuZCIsICJXZXN0IEJhbmsgYW5kIEdhemEiLCAiUGFjaWZpYyBpc2xhbmQgc21hbGwgc3RhdGVzIiwgIlBvc3QtZGVtb2dyYXBoaWMgZGl2aWRlbmQiLCAiRnJlbmNoIFBvbHluZXNpYSIsICJTb3V0aCBBc2lhIiwgCiJTdWItU2FoYXJhbiBBZnJpY2EgKGV4Y2x1ZGluZyBoaWdoIGluY29tZSkiLCAiU3ViLVNhaGFyYW4gQWZyaWNhIiwgIkVhc3QgQXNpYSAmIFBhY2lmaWMgKElEQSAmIElCUkQgY291bnRyaWVzKSIsICJFdXJvcGUgJiBDZW50cmFsIEFzaWEgKElEQSAmIElCUkQgY291bnRyaWVzKSIsICJMYXRpbiBBbWVyaWNhICYgdGhlIENhcmliYmVhbiAoSURBICYgSUJSRCBjb3VudHJpZXMpIiwgIk1pZGRsZSBFYXN0ICYgTm9ydGggQWZyaWNhIChJREEgJiBJQlJEIGNvdW50cmllcykiLCAiU291dGggQXNpYSAoSURBICYgSUJSRCkiLCAiU3ViLVNhaGFyYW4gQWZyaWNhIChJREEgJiBJQlJEIGNvdW50cmllcykiLCAiVXBwZXIgbWlkZGxlIGluY29tZSIuIAoKCkxldCdzIHJlbW92ZSB0aGVzZSByZWdpb25zOgpgYGB7cn0KbW9ydGFsaXR5ICU8PiUgCmZpbHRlcighQ291bnRyeSAlaW4lIGMoIkVhc3QgQXNpYSAmIFBhY2lmaWMgKGV4Y2x1ZGluZyBoaWdoIGluY29tZSkiLCAiRWFybHktZGVtb2dyYXBoaWMgZGl2aWRlbmQiLCAiRWFzdCBBc2lhICYgUGFjaWZpYyIsICJFdXJvcGUgJiBDZW50cmFsIEFzaWEgKGV4Y2x1ZGluZyBoaWdoIGluY29tZSkiLCAiRXVyb3BlICYgQ2VudHJhbCBBc2lhIiwgIkV1cm8gYXJlYSIsICJGcmFnaWxlIGFuZCBjb25mbGljdCBhZmZlY3RlZCBzaXR1YXRpb25zIiwgIkV1cm9wZWFuIFVuaW9uIiwgIkhlYXZpbHkgaW5kZWJ0ZWQgcG9vciBjb3VudHJpZXMgKEhJUEMpIiwgIklCUkQgb25seSIsICJJREEgJiBJQlJEIHRvdGFsIiwgIklEQSB0b3RhbCIsICJJREEgYmxlbmQiLCAiSURBIG9ubHkiLCAiTm90IGNsYXNzaWZpZWQiLCAiTGF0aW4gQW1lcmljYSAmIENhcmliYmVhbiAoZXhjbHVkaW5nIGhpZ2ggaW5jb21lKSIsICJMYXRpbiBBbWVyaWNhICYgQ2FyaWJiZWFuIiwgIkxlYXN0IGRldmVsb3BlZCBjb3VudHJpZXM6IFVOIGNsYXNzaWZpY2F0aW9uIiwgIkxvdyBpbmNvbWUiLCIgTG93ZXIgbWlkZGxlIGluY29tZSIsICJMb3cgJiBtaWRkbGUgaW5jb21lIiwgIkxhdGUtZGVtb2dyYXBoaWMgZGl2aWRlbmQiLCAiTWlkZGxlIEVhc3QgJiBOb3J0aCBBZnJpY2EiLCAiTWlkZGxlIGluY29tZSIsICJNaWRkbGUgRWFzdCAmIE5vcnRoIEFmcmljYSAoZXhjbHVkaW5nIGhpZ2ggaW5jb21lKSIsICJOb3J0aCBBbWVyaWNhIiwgIk9FQ0QgbWVtYmVycyIsICJPdGhlciBzbWFsbCBzdGF0ZXMiLCAiUHJlLWRlbW9ncmFwaGljIGRpdmlkZW5kIiwgIldlc3QgQmFuayBhbmQgR2F6YSIsICJQYWNpZmljIGlzbGFuZCBzbWFsbCBzdGF0ZXMiLCAiUG9zdC1kZW1vZ3JhcGhpYyBkaXZpZGVuZCIsICJGcmVuY2ggUG9seW5lc2lhIiwgIlNvdXRoIEFzaWEiLCAKIlN1Yi1TYWhhcmFuIEFmcmljYSAoZXhjbHVkaW5nIGhpZ2ggaW5jb21lKSIsICJTdWItU2FoYXJhbiBBZnJpY2EiLCAiRWFzdCBBc2lhICYgUGFjaWZpYyAoSURBICYgSUJSRCBjb3VudHJpZXMpIiwgIkV1cm9wZSAmIENlbnRyYWwgQXNpYSAoSURBICYgSUJSRCBjb3VudHJpZXMpIiwgIkxhdGluIEFtZXJpY2EgJiB0aGUgQ2FyaWJiZWFuIChJREEgJiBJQlJEIGNvdW50cmllcykiLCAiTWlkZGxlIEVhc3QgJiBOb3J0aCBBZnJpY2EgKElEQSAmIElCUkQgY291bnRyaWVzKSIsICJTb3V0aCBBc2lhIChJREEgJiBJQlJEKSIsICJTdWItU2FoYXJhbiBBZnJpY2EgKElEQSAmIElCUkQgY291bnRyaWVzKSIsICJVcHBlciBtaWRkbGUgaW5jb21lIikpICAKCmBgYAoKCgoKIyMgVVMgU3BlY2lmaWMgRGF0YQoKTm93IHdlIHdpbGwgdGFrZSBhIGxvb2sgYXQgdGhlIFVTIGRhdGEgYWJvdXQgZGlzYXN0ZXJzIGFuZCB0ZW1wZXJhdHVyZS4KCiMjIyBEaXNhc3RlcnMKCmBgYHtyfQp1c19kaXNhc3RlciAKYGBgCgpXZSBhcmUgc3BlY2lmaWNhbGx5IGludGVyZXN0ZWQgaW4gdGhlIGBZZWFyYCBhbmQgIHRoZSB2YXJpYWJsZXMgdGhhdCBjb250YWluIHRoZSB3b3JkIGAiQ291bnQiYCBzbyB3ZSB3aWxsIHNlbGVjdCB0aGVtIHVzaW5nIHRoZSBgc2VsZWN0KClgIGFuZCBgY29udGFpbnMoKWAgZnVuY3Rpb25zIGluIHRoZSBgZHBseXJgIHBhY2thZ2UuIFNpbmNlIHdlIGFyZSBzZWxlY3RpbmcgZm9yIHZhcmlhYmxlcyB3aXRoIHRoZSB3b3JkIGAiQ291bnQiYCB3ZSBuZWVkIHRvIHVzZSBxdW90YXRpb24gbWFya3MgYXJvdW5kIGl0LiBTZWxlY3RpbmcgZm9yIHRoZSB2YXJpYWJsZSBgeWVhcmAgZG9lcyBub3QgcmVxdWlyZSB0aGlzIGFzIHRoYXQgaXMgYWN0dWFsbHkgdGhlIG5hbWUgb2Ygb25lIG9mIHRoZSBleGlzdGluZyB2YXJpYWJsZXMuCgoKYGBge3J9CnVzX2Rpc2FzdGVyICU8PiUKICAgICAgICAgICBzZWxlY3QoWWVhciwgY29udGFpbnMoIkNvdW50IikpCgp1c19kaXNhc3RlciAlPiUKICBzbGljZV9oZWFkKG4gPSA2KQpgYGAKCk5vdyB3ZSB3YW50IHRvIGNyZWF0ZSBhIG5ldyB2YXJpYWJsZSB0aGF0IHdpbGwgYmUgdGhlIHN1bSBvZiBhbGwgdGhlIGRpZmZlcmVudCB0eXBlcyBvZiBkaXNhc3RlcnMgZm9yIGVhY2ggeWVhci4gCgpXZSBjYW4gY3JlYXRlIHRoaXMgbmUgdmFyaWFibGUgdXNpbmcgdGhlIGBtdXRhdGUoKWAgZnVuY3Rpb24gb2YgYGRwbHlyYCBhbmQgd2Ugd2lsbCB1c2UgdGhlIGJhc2UgYHJvd1N1bXMoKWAgZnVuY3Rpb24gdG8gcGVyZm9ybSB0aGUgY2FsY3VsYXRpb24uIFdlIGRvbnQgd2FudCB0byBpbmNsdWRlIHRoZSBgWWVhcmAgdmFyaWFibGUgaW4gb3VyIHN1bSwgc28gd2UgY2FuIGV4Y2x1ZGUgaXQgdXNpbmcgdGhlIGBzZWxlY3RgZnVuY3Rpb24gd2l0aGluIHRoZSBgcm93U3VtcygpYCBmdW5jdGlvbi4gSG93ZXZlciwgdG8gZG8gc28gd2UgbmVlZCB0byBpbmRpY2F0ZSB0aGF0IHdlIGFyZSB1c2luZyB0aGUgZGF0YSB0aGF0IHdlIGFscmVhZHkgdXNlZCBhcyBpbnB1dCB0byBvdXIgYG11dGF0ZSgpYCBhbmQgYHJvd1N1bXMoKWAgZnVuY3Rpb25zLiBXZSBjYW4gZG8gc28gYnkgdXNpbmcgYSBgLmAuIAoKCmBgYHtyfQp1c19kaXNhc3RlciAlPD4lCiAgbXV0YXRlKGBEaXNhc3RlcnNgID0gcm93U3VtcyhzZWxlY3QoLiwgLVllYXIpKSkgCgp1c19kaXNhc3RlciAlPiUKICBnbGltcHNlKCkKYGBgCgpHcmVhdCwgbm93IHdlIGFyZSBnb2luZyB0byByZW1vdmUgc29tZSBvZiB0aGVzZSB2YXJpYWJsZXMgYW5kIGp1c3Qga2VlcCBvciBzZWxlY3QgdXNpbmcgdGhlIGBzZWxlY3QoKWAgZnVuY3Rpb24gdGhlIHZhcmlhYmxlcyB3ZSBhcmUgaW50ZXJlc3RlZCBpbi4gV2Ugd2lsbCBrZWVwIHRoZSBgRmxvb2RpbmcgQ291bnRgIGJlY3Vhc2UgYXMgeW91IG1heSByZWNhbGwgZnJvbSBlYXJsaWVyIGluIHRoaXMgY2FzZSBzdHVkeSwgZXZlbnRzIG9mIGV4dHJlbWUgcGVyY2lwdGF0aW9uIGxldmVscyBhcHBlYXIgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIGdsb2JhbCB3YXJtaW5nLiBXZSB3aWxsIHVzZSB0aGlzIGFzIGEgcHJveHkgZm9yIHRoYXQuCgpXZSBhcmUgYWxzbyBnb2luZyB0byBhZGQgYSBuZXcgdmFyaWFibGUgY2FsbGVkIGBDb3VudHJ5YCB0byBpbmRpY2F0ZSB0aGF0IHRoaXMgZGF0YSBpcyBmcm9tIHRoZSBVbml0ZWQgU3RhdGVzLiBUaGlzIHdpbGwgY3JlYXRlIGEgbmV3IHZhcmlhYmxlIHdoZXJlIGV2ZXJ5IHZhbHVlIGlzIGBVbml0ZWQgU3RhdGVzYC4KYGBge3J9CnVzX2Rpc2FzdGVyICU8PiUKICBkcGx5cjo6c2VsZWN0KFllYXIsCiAgICAgICAgICAgICAgICBEaXNhc3RlcnMpICU+JQogIG11dGF0ZShDb3VudHJ5ID0gIlVuaXRlZCBTdGF0ZXMiKSAlPiUKICBwaXZvdF9sb25nZXIoY29scyA9IGMoLSBDb3VudHJ5LCAtIFllYXIpLAogICAgICAgICAgIG5hbWVzX3RvID0gIkluZGljYXRvciIsCiAgICAgICAgICB2YWx1ZXNfdG8gPSAiVmFsdWUiKSAlPiUKICBtdXRhdGUoTGFiZWwgPSAiTnVtYmVyIG9mIERpc2FzdGVycyIpCgp1c19kaXNhc3RlciAlPiUKICBzbGljZV9oZWFkKG4gPSA2KQpgYGAKCgoKIyMjIFRlbXBlcmF0dXJlCgpgYGB7cn0KdXNfdGVtcGVyYXR1cmUgJT4lCiAgc2xpY2VfaGVhZChuID0gNikKYGBgCk9LLCBzbyB3ZSB3YW50IHRvIHJlbW92ZSB0aGUgYEFub21hbHlgIHZhcmlhYmxlIHdoaWNoIGlzIGFuIGluZGljYXRvciBvZiBob3cgZGlmZmVyZW50IHRoZSBuYXRpb25hbCBhdmVyYWdlIHRlbXBlcmF0dXJlIGZvciB0aGF0IHllYXIgd2FzIGZyb20gdGhlIGF2ZXJhZ2UgdGVtcGVyYXR1cmUgZnJvbSAxOTAxLTIwMDAgd2hpY2ggd2FzIDUyLjAyJmRlZztGLiAKCldlIGFsc28gd2FudCB0byBjaGFuZ2UgdGhlIGRhdGUgdmFsdWVzLCB3aGljaCBhcmUgY3VycmVudGx5IGxpc3RlZCBhcyB0aGUgeWVhciBmb2xsb3dlZCBieSB0aGUgbnVtYmVyIDEyLiBUbyBkbyBzbyB3ZSB3YW50IHRvIGp1c3Qga2VlcCB0aGUgZmlyc3QgNCBjaGFyYWN0ZXJzIGluIHRoZSBgRGF0ZWAgdmFyaWFibGUgc3RyaW5nIHZhbHVlcy4gV2UgY2FuIHVzZSB0aGUgYHN0cl9zdWIoKWAgZnVuY3Rpb24gb2YgdGhlIGBzdHJpbmdyYCBwYWNrYWdlIHRvIGRvIHRoaXMuIFdlIGp1c3QgbmVlZCB0byBpbmRpY2F0ZSB0aGUgc3RhcnQgYW5kIHN0b3AgY2hhcmFjdGVycy4gSW4gdGhpcyBjYXNlIHRoZSBzdGFydCB3b3VsZCBiZSAxIGFuZCB0aGUgNHRoIGNoYXJhY3RlciB3b3VsZCBiZSB3aGVyZSB3ZSB3YW50IHRvIHN0b3AsIHNvIHdlIHdvdWxkIHVzZSBgc3RhcnQgPSAxLCBzdG9wID0gNGAuIEFnYWluIHdlIHdpbGwgY3JlYXRlIGEgYENvdW50cnlgIHZhcmlhYmxlLiBXZSB3aWxsIGFsc28gY2hhbmdlIHRoZSBuYW1lIG9mIHRoZSBgRGF0ZWAgdmFyaWFibGUgdG8gYFllYXJgIHNvIHRoYXQgaXQgd2lsbCBiZSBjb25zaXN0ZW50IHdpdGggb3VyIG90aGVyIGRhdGFzZXRzLiBGdXJ0aGVybW9yZSwgd2UgYWxzbyB3aGF0IGl0IHRvIGJlIG51bWVyaWMuIFdlIGNhbiBhY2NvbXBsaXNoIGJvdGggcmVuYW1pbmcgYW5kIGNoYW5naW5nIHRvIG51bWVyaWMgYnkgdXNpbmcgdGhlIGBtdXRhdGUoKWAgZnVuY3Rpb24uIFdlIGNhbnRoZW4gcmVtb3ZlIHRoZSBgRGF0ZWAgdmFyaWFibGUgYW5kIGFsc28gb3JkZXIgdGhlIGNvbHVtbnMganVzdCBsaWtlIHRoZSBvdGhlciB1cyBkYXRhIHVzaW5nIHRoZSBgc2VsZWN0KClgIGZ1bmN0aW9uLgoKYGBge3J9CnVzX3RlbXBlcmF0dXJlICU8PiUKICBkcGx5cjo6c2VsZWN0KC1Bbm9tYWx5KSAlPiUKICBtdXRhdGUoRGF0ZSA9IHN0cl9zdWIoRGF0ZSwgc3RhcnQgPSAxLCBlbmQgPSA0KSklPiUKICByZW5hbWUoKSAlPiUKICBtdXRhdGUoWWVhciA9IGFzLm51bWVyaWMoRGF0ZSksIAogICAgICBDb3VudHJ5ID0gIlVuaXRlZCBTdGF0ZXMiLAogICAgSW5kaWNhdG9yID0gIlRlbXBlcmF0dXJlIiwKICAgICAgICBMYWJlbCA9ICJUZW1wZXJhdHVyZSAoRmFocmVuaGVpdCkiKSAlPiUKICBzZWxlY3QoWWVhciwgQ291bnRyeSwgSW5kaWNhdG9yLCBWYWx1ZSwgTGFiZWwpCgp1c190ZW1wZXJhdHVyZSAlPiUKICBzbGljZV9oZWFkKG4gPSA2KQpgYGAKCgojIyBKb2luaW5nIGRhdGEKCk5vdyB3ZSB3b3VsZCBsaWtlIHRvIGpvaW4gdGhlIGRpZmZlcmVudCBkYXRhc2V0cyB0b2dldGhlciBpbnRvIG9uZSB0aWJibGUuIFRvIGRvIHNvIGl0IGlzIG9mdGVuIG5lY2Vzc2FyeSB0byBoYXZlIGF0IGxlYXN0IG9uZSBjb2x1bW4gb3IgdmFyaWFibGUgd2l0aCB0aGUgc2FtZSBuYW1lIHRvIGJlIHVzZWQgYXMgYSBrZXkgZm9yIHB1dHRpbmcgeW91ciBkYXRhIHRvZ2V0aGVyLiBUbyBwdXQgYWxsIG9mIG91ciBkYXRhIHRvZ2V0aGVyIHRoZXJlIGFyZSBzZXZlcmFsIGAqX2pvaW4oKWAgZnVuY3Rpb25zIGF2YWlsYWJsZSBpbiB0aGUgYGRwbHlyYCBwYWNrYWdlLiAKCgpgYGB7ciwgZWNobyA9IEZBTFNFLCBvdXQud2lkdGggPSAiODAwIHB4In0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoaGVyZTo6aGVyZSgiaW1nIiwgImpvaW4ucG5nIikpCmBgYAoKV2Ugd2lsbCB1c2UgdGhlIGBmdWxsX2pvaW4oKWAgZnVuY3Rpb24gYXMgd2UgaGF2ZSBkaWZmZXJlbnQgdGltZSBzcGFucyBmb3IgZWFjaCBkYXRhc2V0IGFuZCB3ZSB3b3VsZCBsaWtlIHRvIHJldGFpbiBhcyBtdWNoIGRhdGEgYXMgcG9zc2libGUuIFRoZWBmdWxsX2pvaW4oKWAgZnVuY3Rpb24gd2lsbCBzaW1wbHkgY3JlYXRlIGBOQWAgdmFsdWVzIGZvciBhbnkgb2YgdGhlIHllYXJzIHRoYXQgYXJlIG5vdCBpbiBvbmUgb2YgdGhlIGRhdGEgc2V0cy4gV2UgY2FuIGNoZWNrIGJ5IHVzaW5nIHRoZSBiYXNlIGBzdW1tYXJ5KClgIGZ1bmN0aW9uLiBUaGlzIHdpbGwgYWxzbyBhbGxvdyB1cyB0byBjaGVjayB0aGF0IHRoZXJlIGFyZSBjb2x1bW4gbmFtZXMgdGhhdCBhcmUgY29uc2lzdGVudCBpbiBlYWNoIGRhdGFzZXQgdGhhdCB3ZSB3aXNoIHRvIGNvbWJpbmUuCgpgYGB7cn0Kc3VtbWFyeShDTzJfZW1pc3Npb25zKQpzdW1tYXJ5KGdkcF9ncm93dGgpCnN1bW1hcnkoZW5lcmd5X3VzZSkKc3VtbWFyeShtb3J0YWxpdHkpCgpgYGAKCkluZGVlZCwgYENvdW50cnlgLCBhbmQgYFllYXJgIHZhcmlhYmxlcyBhcmUgcHJlc2VudCBpbiBhbGwgb2YgdGhlIGRhdGFzZXRzLiBXZSBjYW4gc2VlIHRoYXQgdGhlIG1pbmltdW0gYW5kIG1heGltdW0geWVhciBpcyBkaWZmZXJlbnQgZm9yIG5lYXJseSBhbGwgdGhlIGRhdGFzZXRzLgoKV2UgbmVlZCB0byBzcGVjaWZ5IHdoYXQgY29sdW1ucy92YXJpYWJsZXMgd2Ugd2lsbCBiZSBqb2luaW5nIGJ5IHVzaW5nIHRoZSBgYnkgPWAgYXJndW1lbnQgaW4gdGhlIGBmdWxsX2pvaW4oKWAgZnVuY3Rpb24uCgpgYGB7cn0KCmRhdGFfd2lkZSA8LSBDTzJfZW1pc3Npb25zICU+JQogIGZ1bGxfam9pbihnZHBfZ3Jvd3RoLCBieSA9IGMoIkNvdW50cnkiLCAiWWVhciIsICJMYWJlbCIpKSAlPiUKICBmdWxsX2pvaW4oZW5lcmd5X3VzZSwgYnkgPSBjKCJDb3VudHJ5IiwgIlllYXIiLCAiTGFiZWwiKSkgJT4lCiAgZnVsbF9qb2luKG1vcnRhbGl0eSwgYnkgPSBjKCJDb3VudHJ5IiwgIlllYXIiLCAiTGFiZWwiKSkKCmRhdGFfd2lkZSAlPiUKICBzbGljZV9zYW1wbGUobiA9IDYpCgpgYGAKCldlIGNhbiBhbHNvIGRvIHRoZSBzYW1lIHRoaW5nIHVzaW5nIGJ5IHVzaW5nIHRoZWByZWR1Y2UoKWAgZnVuY3Rpb24gb2YgdGhlIGBwdXJycmAgcGFja2FnZS4gVGhpcyBpcyBhIGdvb2Qgb3B0aW9uIGlmIHlvdSBoYXZlIG1hbnkgZGFzYXNldHMgdG8gY29tYmluZS4KCgpgYGB7cn0KZGF0YV93aWRlIDwtIGxpc3QoQ08yX2VtaXNzaW9ucywgCiAgICAgICAgICAgICAgICBnZHBfZ3Jvd3RoLCAKICAgICAgICAgICAgICAgIGVuZXJneV91c2UsIAogICAgICAgICAgICAgICAgbW9ydGFsaXR5KSAlPiUgCiAgcmVkdWNlKGZ1bGxfam9pbiwgYnkgPSBjKCJDb3VudHJ5IiwgIlllYXIiLCAiTGFiZWwiKSkKCmRhdGFfd2lkZSAlPiUKICBzbGljZV9oZWFkKG4gPSA2KQpgYGAKCmBgYHtyfQpkYXRhX3dpZGUgJT4lCiAgZ2xpbXBzZSgpCmBgYAoKTmljZSwgbG9va3MgZ29vZCEKCldlIHdpbGwgYWxzbyBtYWtlIGEgbG9uZyB2ZXJzaW9uIG9mIHRoaXMgZGF0YSwgd2hlcmUgd2Ugd2lsbCBjcmVhdGUgYW4gbmV3IHZhcmlhYmxlIGNhbGxlZCBgSW5kaWNhdG9yYCB0aGF0IHdpbGwgaW5kaWNhdGUgd2hhdCBkYXRhc2V0IHRoZSBkYXRhIGNhbWUgZnJvbSBhbmQgd2Ugd2lsbCBjb2xsYXBzZSB0aGUgdmFsdWVzIGZyb20gdGhlIGNvbHVtbnMgY2FsbGVkIGAgRW1pc3Npb25zYCAoYENPMiBFbWlzc2lvbnMgKE1nKWApLCBgR0RQYChgR0RQIEdyb3d0aC9DYXBpdGEgKCUpYCksIGBFbmVyZ3lgKGBFbmVyZ3kgVXNlIChrZywgb2lsLWVxLi9jYXBpdGEpYCksIGFuZCBgRGVhdGhzYCAoYERlYXRocy8xMDAwIFBlb3BsZWApLiAKCgpgYGB7cn0KZGF0YV9sb25nIDwtIGRhdGFfd2lkZSAlPiUKICBwaXZvdF9sb25nZXIoY29scyA9IGMoLUNvdW50cnksIC1ZZWFyLCAtTGFiZWwpLCAKICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAiSW5kaWNhdG9yIiwgCiAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJWYWx1ZSIpCmRhdGFfbG9uZyAlPiUKICBzbGljZV9zYW1wbGUobiA9IDYpCmBgYAoKCgpXZSB3aWxsIG5vdyBjb21iaW5lIHRoaXMgZGF0YSB3aXRoIHRoZSBVUyBkYXRhIGFib3V0IGRpc2FzdGVycyBhbmQgdGVtcGVyYXR1cmVzLgoKV2Ugd2lsbCBub3cgdXNlIHRoZSBgYmluZF9yb3dzKClgIGZ1bmN0aW9uIHdoaWNoIHdpbGwganVzdCBhcHBlbmQgdGhlIGB1c190ZW1wZXJhdHVyZWAgZGF0YSBhbmQgdGhlIGB1c19kaXNhc3RlcmAgZGF0YSBhZnRlciB0aGUgYGRhdGFfbG9uZ2AgZGF0YS4gCgoKYGBge3J9CnVzX2Rpc2FzdGVyICU+JQogIHNsaWNlX2hlYWQobiA9IDYpICAgICAKdXNfdGVtcGVyYXR1cmUgJT4lCiAgc2xpY2VfaGVhZChuID0gNikgICAgCgpkYXRhX2xvbmcgPC1saXN0KGRhdGFfbG9uZywgCiAgICAgICAgICAgICAgIHVzX2Rpc2FzdGVyLAogICAgICAgICAgICAgICB1c190ZW1wZXJhdHVyZSkgJT4lCiAgYmluZF9yb3dzKCkKZGF0YV9sb25nJENvdW50cnkgPC0gYXMuZmFjdG9yKGRhdGFfbG9uZyRDb3VudHJ5KQpgYGAKCldlIGNhbiBjaGVjayB0aGUgdG9wIGFuZCBib3R0b20gb2YgdGhlIG5ldyBgZGF0YV9sb25nYCB0aWJibGUgdG8gc2VlIHRoYXQgb3VyIGB1c190ZW1wZXJhdHVyZWAgZGF0YSBpcyBhdCB0aGUgYm90dG9tLiBUbyBzZWUgdGhlIGVuZCBvZiBvdXIgdGliYmxlIHdlIGNhbiB1c2UgYHNsaWNlX3RhaWwoKWAgZnVuY3Rpb24gb2YgdGhlIGBkcGx5cmAgcGFja2FnZS4KCmBgYHtyfQpkYXRhX2xvbmcgJT4lCiAgc2xpY2VfaGVhZChuID0gNikKCmRhdGFfbG9uZyAlPiUKICBzbGljZV90YWlsKG4gPSA2KQoKZGF0YV9sb25nICU+JQogIHNsaWNlX3NhbXBsZShuID0gMTApCmBgYAoKCjxkZXRhaWxzPiA8c3VtbWFyeT4gQ2xpY2sgaGVyZSBmb3IgZGV0YWlscyBhYm91dCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGBmdWxsX2pvaW4oKWAgYW5kIGBiaW5kX3Jvd3MoKWAgPC9zdW1tYXJ5PgoKVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGlzIGZ1bmN0aW9uIGFuZCB0aGUgYGZ1bGxfam9pbigpYCBmdW5jdGlvbiBpcyB0aGF0IHRoZSBgYmluZF9yb3dzKClgIGZ1bmN0aW9uIHdpbGwgZXNzZW50aWFsbHkganVzdCBhcHBlbmQgZWFjaCBkYXRhc2V0IHRvIGVhY2ggb3RoZXIsIHdoZXJlYXMgdGhlIGBmdWxsX2pvaW4oKWAgZnVuY3Rpb24gY29sbGFwc2VzIGRhdGEgdGhhdCBpcyBjb21wYXJhYmxlLiBIZXJlIHlvdSB3aWxsIHNlZSBhbiBleGFtcGxlIG9mIHdoYXQgdGhlIGRhdGEgd291bGQgaGF2ZSBiZWVuIGxpa2UgZm9yIGBkYXRhX3dpZGVgIGlmIHdlIGhhZCBtYWRlIGl0IHVzaW5nIGBiaW5kX3Jvd3MoKWAgYW5kIGlmIGBmdWxsX2pvaW4oKWAgaGFkIGJlZW4gdXNlZCBidXQgd2FzIG5vdCBqb2luZWQgYnkgdGhlIGBMYWJlbGAgdmFyaWFibGUuIFNpbmNlIHRoZSBgTGFiZWxgIHZhcmlhYmxlIGhhcyB1bmlxdWUgdmFsdWVzIGZvciBlYWNoIHR5cGUgb2YgYEluZGljYXRvcmAsIHRoaXMgY2F1c2VzIHRoZSBgZnVsbF9qb2luKClgIHJlc3VsdCB0byBiZSB0aGUgc2FtZSBhcyBgYmluZF9yb3dzKClgLiBXZSB3aWxsIHNwZWNpZmljYWxseSBsb29rIGF0IHRoZSB2YWx1ZXMgZm9yIENoaW5hIGluIHRoZSB5ZWFyIG9mIDE5ODAuCgpgYGB7cn0KZGF0YV93aWRlX2JyIDwtIGxpc3QoQ08yX2VtaXNzaW9ucywgCiAgICAgICAgICAgICAgICBnZHBfZ3Jvd3RoLCAKICAgICAgICAgICAgICAgIGVuZXJneV91c2UsIAogICAgICAgICAgICAgICAgbW9ydGFsaXR5KSAlPiUgCiAgYmluZF9yb3dzKCkKCgpkYXRhX3dpZGVfZmogPC0gbGlzdChDTzJfZW1pc3Npb25zLCAKICAgICAgICAgICAgICAgIGdkcF9ncm93dGgsIAogICAgICAgICAgICAgICAgZW5lcmd5X3VzZSwgCiAgICAgICAgICAgICAgICBtb3J0YWxpdHkpICU+JSAKICByZWR1Y2UoZnVsbF9qb2luLCBieSA9IGMoIkNvdW50cnkiLCAiWWVhciIpKQoKZGF0YV93aWRlX2ZqX2xhYmVsIDwtIGxpc3QoQ08yX2VtaXNzaW9ucywgCiAgICAgICAgICAgICAgICBnZHBfZ3Jvd3RoLCAKICAgICAgICAgICAgICAgIGVuZXJneV91c2UsIAogICAgICAgICAgICAgICAgbW9ydGFsaXR5KSAlPiUgCiAgcmVkdWNlKGZ1bGxfam9pbiwgYnkgPSBjKCJDb3VudHJ5IiwgIlllYXIiLCAiTGFiZWwiKSkKCgpkaW0oZGF0YV93aWRlX2ZqKQpkaW0oZGF0YV93aWRlX2JyKQoKaWRlbnRpY2FsKGRhdGFfd2lkZV9mal9sYWJlbCwgZGF0YV93aWRlX2JyKQoKZGF0YV93aWRlX2ZqICU+JQogIGZpbHRlcihDb3VudHJ5ID09ICJDaGluYSIsIFllYXIgPT0gIjE5ODAiKQoKZGF0YV93aWRlX2JyICU+JQogIGZpbHRlcihDb3VudHJ5ID09ICJDaGluYSIsIFllYXIgPT0gIjE5ODAiKQoKZGF0YV93aWRlX2ZqX2xhYmVsICU+JQogIGZpbHRlcihDb3VudHJ5ID09ICJDaGluYSIsIFllYXIgPT0gIjE5ODAiKQpgYGAKPC9kZXRpYWxzPgoKCgpXZSB3aWxsIGFsc28gY3JlYXRlIGEgbmV3IHZhcmlhYmxlIGNhbGxlZCBgUmVnaW9uYCB0aGF0IHdpbGwgaW5kaWNhdGUgaWYgdGhlIGRhdGEgaXMgYWJvdXQgdGhlIFVuaXRlZCBTdGF0ZXMgb3IgYSBkaWZmZXJlbnQgY291bnRyeSBiYXNlZCBvbiB0aGUgdmFsdWVzIGluIHRoZSBgQ291bnRyeWAgdmFyaWFibGUuIFdlIHdpbGwgdXNlIHRoZSBgY2FzZV93aGVuKClgIGZ1bmN0aW9uIG9mIHRoZSBgZHBseXJgIHBhY2thZ2UgdG8gZG8gdGhpcy4gSWYgdGhlIGBDb3VudHJ5YCB2YXJpYWJsZSBpcyBlcXVhbCB0byBgIlVuaXRlZCBTdGF0ZXMiYCB0aGUgdmFsdWUgZm9yIHRoZSBuZXcgdmFyaWFibGUgd2lsbCBhbHNvIGJlICJVbml0ZWQgU3RhdGVzIiwgd2hlcmUgYXMgaWYgdGhlIGBDb3VudHJ5YCB2YXJpYWJsZSBpcyBub3QgZXF1YWwgdG8gYCJVbml0ZWQgU3RhdGVzImAgYnV0IGlzIHNvbWUgb3RoZXIgY2hhcmFjdGVyIHN0cmluZyB2YWx1ZSwgc3VjaCBhcyBgIkFmZ2hhbmlzdGFuImAsIHRoZW4gdGhlIHZhbHVlIGZvciB0aGUgbmV3IHZhcmlhYmxlIHdpbGwgYmUgYCJSZXN0IG9mIHRoZSBXb3JsZCJgLgpUaGUgbmV3IHZhbHVlcyBmb3IgdGhlIG5ldyB2YXJpYWJsZSBgUmVnaW9uYCBhcmUgaW5kaWNhdGVkIGFmdGVyIHRoZSBzcGVjaWZpYyBjb25kaXRpb25hbCBzdGF0ZW1lbnRzIGJ5IHVzaW5nIHRoZSBgfmAgc3ltYm9sLiAKCgpgYGB7cn0KIGRhdGFfbG9uZyAlPD4lCiAgbXV0YXRlKFJlZ2lvbiA9IGNhc2Vfd2hlbihDb3VudHJ5ID09ICJVbml0ZWQgU3RhdGVzIiB+ICJVbml0ZWQgU3RhdGVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvdW50cnkgIT0gIlVuaXRlZCBTdGF0ZXMiIH4gIlJlc3Qgb2YgdGhlIFdvcmxkIikpCgoKZGF0YV9sb25nICU+JQogIHNsaWNlX2hlYWQobiA9IDYpCmBgYAoKVG8gcmVtb3ZlIGVudHJpZXMgZm9yIGNvdW50cmllcyB3aXRoIE5BIHZhbHVlcyB3ZSBjYW4gdXNlIHRoZSBgZHJvcF9uYSgpYCBmdW5jdGlvbiBvZiB0aGUgYHRpZHlyYCBwYWNrYWdlIHRvIGRyb3AgYWxsIHllYXJzIHdpdGggbWlzc2luZyBkYXRhLgoKYGBge3J9CmRhdGFfbG9uZ193aXRoX21pc3MgPC0gZGF0YV9sb25nICU+JQogIGFycmFuZ2UoQ291bnRyeSkKCmRhdGFfbG9uZyAlPD4lCiAgZHJvcF9uYSgpICU+JQogIGFycmFuZ2UoQ291bnRyeSkKCmBgYAoKWW91IGNhbiBzZWUgdGhhdCBieSByZW1vdmluZyB0aGUgTkEgdmFsdWVzIHRoZSBkYXRhIGZvciBBZmdoYW5pc3RhbiBzdGFydHMgYXQgMTk0OSBpbnN0ZWFkIG9mIDE3NTEuCgpgYGB7cn0KCmRhdGFfbG9uZyAlPiUKICBzbGljZV9oZWFkKG4gPSA2KQoKYGBgCgojICoqRGF0YSBFeHBsb3JhdGlvbioqCioqKiAKTm93IHdlIHdpbGwgY3JlYXRlIHNvbWUgc2ltcGxlIHBsb3RzIHRvIGV4YW1pbmUgdGhlIGRhdGEuCgpXZSBjYW4gY2hlY2sgdGhlIHRpbWUgc3BhbiBvZiB0aGlzIGRhdGEgYnkgcmVmZXJpbmcgYmFjayB0byB0aGUgIFsqKldoYXQgYXJlIHRoZSBkYXRhPyoqXSBzZWN0aW9uLiBUbyBtYWtlIHRoZXNlIHBsb3RzIHdlIHdpbGwgdXNlIHRoZSBgZ2dwbG90MmAgcGFja2FnZS4gVGhlIGZpcnN0IHN0ZXAgaW4gY3JlYXRpbmcgYSBwbG90IGlzIHRvIGRlZmluZSB3aGF0IGRhdGEgd2UgaW50ZW5kIHRvIHVzZSBhbmQgd2hhdCBkYXRhIHdpbGwgYmUgcGxvdGVkIG9uIHRoZSB4LWF4aXMsIHRoZSB5LWF4aXMsIGFuZCBpZiBhbnkgZGF0YSB3aWxsIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBjb2xvciBvciB0aGUgZmlsbCAoYWxzbyBjb2xvciBvZiBwbG90cyB0aGF0IGhhdmUgc29tZXRoaW5nIHRvIGZpbGwgbGlrZSBhIGJhciBwbG90KSBvciBncm91cC4gQWxsIG9mIHRoZXNlIGFyZSBkZWZpbmVkIHVzaW5nIHRoZSBgYWVzKClgIGFyZ3VtZW50LCB3aGljaCBpcyBzaG9ydCBmb3IgYWVzdGhldGljIG1hcHBpbmdzLgoKRmlyc3Qgd2Ugd2lsbCB0YWtlIGEgbG9vayBhdCB0aGUgQ08yIGVtaXNzaW9uIGRhdGEuCgojIyBDTzIgRW1pc3Npb25zICgxNzUxLTIwMTQpCgpXZSBmaXJzdCBuZWVkIHRvIGdpdmUgdGhlIGNvcnJlY3QgZGF0YSBpbnB1dC4gV2Ugd2lsbCBmaWx0ZXIgb3VyIGRhdGEgdG8gb25seSBpbmNsdWRlIHRoZSBDTzIgZW1pc3Npb25zIGRhdGEgYnkgdXNpbmcgdGhlIGBmaWx0ZXIoKWAgZnVuY3Rpb24gb2YgdGhlIGBkcGx5cmAgcGFja2FnZS4gVG8gdXNlIHRoaXMgZnVuY3Rpb24gd2UgbmVlZCB0byBzcGVjaWZ5IHdoYXQgdmFsdWUgd2Ugd2FudCBmb3IgYSBnaXZlbiB2YXJpYWJsZS4gSW4gdGhpcyBjYXNlIHdlIHdhbnQgYWxsIHJvd3Mgd2hlcmUgdGhlIGBJbmRpY2F0b3JgIHZhcmlhYmxlIGlzIGVxdWFsIHRvIHRoZSB3b3JkIGBFbWlzc2lvbnNgLiBOb3RpY2UgdGhhdCB0aGlzIG5lZWRzIHRvIGJlIGluIHF1b3Rlcywgd2hpbGUgdGhlIHZhcmlhYmxlIG5hbWUgZG9lcyBub3QuCgpUaGVuIHdlIHVzZSB0aGUgYGFlcygpYCBhcmd1bWVudCBvZiB0aGUgYGdncGxvdCgpYCBmdW5jdGlvbiB0byBkZWZpbmUgdGhhdCBvdXIgeC1heGlzIHdpbGwgYmUgdGhlIGBZZWFyYCB2YXJpYWJsZSwgdGhlIHktYXhpcyB3aWxsIGJlIHRoZSBlbWlzc2lvbiBgVmFsdWVgIHZhcmlhYmxlLCBhbmQgdGhhdCBvdXIgZGF0YSBzaG91bGQgYmUgZ3JvdXBlZCBvciBzZXBhcnRlZCBieSB0aGUgYENvdW50cnlgIHZhcmlhYmxlLiBJZiB3ZSB3ZXJlIHRvIHN0b3AgdGhlcmUgd2Ugd291bGQgZ2V0IGEgYmxhbmsgcGxvdCwgYXMgeW91IGNhbiBzZWUgYmVsb3cuIFdlIG5lZWQgdG8gYWRkIGFub3RoZXIgbGF5ZXIgdG8gZGVmaW5lIGhvdyB3ZSB3YW50IHRoZSBwbG90IHRvIGxvb2suIFdlIGRvIHNvIGJ5IHVzaW5nIHRoZSBgK2Agc2lnbiBpbiBiZXR3ZWVuIGVhY2ggY29tbWFuZC4gCgoKYGBge3J9CmRhdGFfbG9uZyAlPiUKICBmaWx0ZXIoSW5kaWNhdG9yID09ICJFbWlzc2lvbnMiKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBZZWFyLCB5ID0gVmFsdWUsIGdyb3VwID0gQ291bnRyeSkpCgpgYGAKV2Ugd2lsbCB1c2UgdGhlIGBnZW9tX2xpbmUoKWAgZnVuY3Rpb24gYmVjdWFzZSB3ZSB3b3VsZCBsaWtlIHRvIGNyZWF0ZSBhIGxpbmUgcGxvdC4gVGhlcmUgYXJlIG1hbnkgYGdlb21fKmAgZnVuY3Rpb25zIHRvIGNob29zZSBmcm9tIHRoYXQgY3JlYXRlIG1hbnkgZGlmZmVyZW50IHR5cGVzIG9mIHBsb3RzLgoKVHlwZSBgZ2VvbWAgaW50byB0aGUgUlN0dWRpbyBjb25zb2xlIGFuZCB5b3Ugd2lsbCBzZWUgbWFueSBvcHRpb25zIHRvIHNjcm9sbCB0aHJvdWdoLgoKYGBge3IsIGVjaG8gPSBGQUxTRSwgb3V0LndpZHRoID0gIjgwMCBweCJ9CmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKGhlcmU6OmhlcmUoImltZyIsICJnZW9tXy5wbmciKSkKYGBgClNpbmNlIHdlIGhhdmUgbWFueSBvdmVybGFwcGluZyBsaW5lcywgd2Ugd2lsbCBtYWtlIG91ciBsaW5lcyBzbGlnaHRseSB0cmFuc3BhcmVudCBieSB1c2luZyB0aGUgYGFscGhhYCBhcmd1bWVudC4gVGhpcyB0YWtlcyB2YWx1ZXMgZnJvbSAwIHRvIDEsIHdoZXJlIDAgaXMgY29tcGxldGVseSB0cmFuc3BhcmVudCBhbmQgMSBpcyBjb21wbGV0ZWx5IG9wYWd1ZS4gV2Ugd2lsbCBhbHNvIGFkZCBsYWJlbHMgdXNpbmcgdGhlIGBsYWJzKClgIGZ1bmN0aW9uLiBBZ2Fpbiwgbm90aWNlIHRoYXQgYSBwbHVzIHNpZ24gaXMgdXNlZCBiZXR3ZWVuIGVhY2ggbGF5ZXIgdGhhdCB3ZSBhZGQgdG8gdGhlIHBsb3QuIFRvIG1ha2UgQ08yIGFwcGVhciB3aXRoIGEgc3Vic2NyaXB0IHdlIGNhbiB1c2UgYH5DT1syXX5gLiBXZSB3aWxsIGFsc28gdXNlIHRoZSBmdW5jdGlvbiBgdGhlbWVfbGluZWRyYXcoKWAgb2YgYGdncGxvdDJgIHRvIGNoYW5nZSB0aGUgZ2VuZXJhbCBhcGVhcmFuY2Ugb2YgdGhlIHBsb3QuIAoKVHlwZSBgdGhlbWVfYCBpbiB0aGUgUlN0dWRpbyBjb25zb2xlIHRvIHNlZSB0aGUgdmFyaW9zIHBsb3QgdGhlbWUgb3B0aW9ucyBhdmFpbGFibGUuCgpgYGB7ciwgZWNobyA9IEZBTFNFLCBvdXQud2lkdGggPSAiODAwIHB4In0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoaGVyZTo6aGVyZSgiaW1nIiwgInRoZW1lcy5wbmciKSkKYGBgCgpXZSB3aWxsIGFsc28gdXNlIHRoZSBgdGhlbWUoKWAgZnVuY3Rpb24gdG8gY2hhbmdlIHRoZSBmb250IHNpemUgb2YgdGhlIHgtYXhpcywgeS1heGlzLCBheGlzIHRpdGxlcywgYW5kIHRoZSBjYXB0aW9uIGFzIHNob3duIGJlbG93LiBUbyBrbm93IHdoYXQgdG8gY2FsbCBlYWNoIGVsZW1lbnQgb2YgdGhlIHBsb3QgaW4gdGhpcyBmdW5jdGlvbiB0byBjaGFuZ2UgdGhlIHNpemUgdHlwZSBgP3RoZW1lKClgIGluIHRoZSBjb25zb2xlLiBZb3Ugd2lsbCBzZWUgYSB2ZXJ5IGxhcmdlIGxpc3QgdGhhdCBpbmNsdWRlcyBvdGhlciBwbG90IGFzcGVjdHMgbGlrZSB0aGUgYmFja2dyb3VuZCBhbmQgdGhlIGxlZ2VuZC4gVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBtb2RpZnkgeW91ciBwbG90IHRvIHlvdXIgc3BlY2lmaWNhdGlvbnMuIFdlIHdpbGwgYWxzbyB1c2UgaXQgdG8gcmVtb3ZlIHRoZSBsZWdlbmQgdGl0bGUgYnkgdXNpbmcgYGVsZW1lbnRfYmxhbmsoKWAuIEluIHRoaXMgY2FzZSwgd2UgYXJlIGFsc28gc2F2aW5nIHRoZSBwbG90IHRvIGFuIG9iamVjdCBjYWxsZWQgYGNvMnBsb3RgLiBUbyBzaG93IHRoZSBwbG90IHdlIHNpbXBseSB0eXBlIHRoZSBuYW1lIG9mIHRoZSBvYmplY3QuCgpgYGB7cn0KY28ycGxvdCA8LWRhdGFfbG9uZyAlPiUKICBmaWx0ZXIoSW5kaWNhdG9yID09ICJFbWlzc2lvbnMiKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBZZWFyLCB5ID0gVmFsdWUsIGdyb3VwID0gQ291bnRyeSkpKwogIGdlb21fbGluZShhbHBoYSA9IDAuNCkgKyAKICBsYWJzKHRpdGxlID0gIkNvdW50cnkiIH5DT1syXX4gIkVtaXNzaW9ucyBwZXIgWWVhciwgMTc1MS0yMDE0IiwKICAgICBjYXB0aW9uID0gIkxpbWl0ZWQgdG8gcmVwb3J0aW5nIGNvdW50cmllcyIsCiAgICAgICAgICAgeSA9ICJFbWlzc2lvbnMgKE1ldHJpYyBUb25zKSIpICsKICB0aGVtZV9saW5lZHJhdygpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLAogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksCiAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwKICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLAogICAgICAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksCiAgICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2KSwKICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSkKCmNvMnBsb3QKYGBgCgpHcmVhdCEgV2UndmUgY3JlYXRlZCBvdXIgZmlyc3QgcGxvdC4gV2UgY2FuIHNlZSB0aGF0IG1hbnkgY291bnRyaWVzIHNob3cgYSBkcmFtYXRpYyBpbmNyZWFzZSBpbiBlbWlzc2lvbnMgb3ZlciB0aW1lIHdpdGggYSBoYW5kZnVsIG9mIGNvdW50cmllcyB3aXRoIHBhcnRpY3VsYXJseSBoaWdoIGxldmVscy4gV2hhdCBhYm91dCB0aGUgVW5pdGVkIFN0YXRlcz8gV2hpY2ggbGluZSBpbmRpY2F0ZXMgdGhlIGVtaXNzaW9ucyBpbiB0aGUgVVM/IFdlIGNhbiBhZGQgYW5vdGhlciBsYXllciBvbiB0b3Agb2Ygb3VyIGZpcnN0IHBsb3QgdG8gYWRkIGEgcmVkIGxpbmUganVzdCBmb3IgdGhlIFVTIGRhdGEuIFRvIGRvIHRoaXMgd2UgbmVlZCB0byBpbmRpY2F0ZSB3aGF0IGRhdGEgd2Ugd291bGQgbGlrZSB0byBwbG90LCBzbyB3ZSBuZWVkIHRvIGZpbHRlciBmb3IganVzdCB0aGUgVVMgZGF0YSBhbmQgdGhlbiB3ZSBuZWVkIHRvIGluZGljYXRlIHRoYXQgaXQgd2lsbCBiZSBjb2xvcmVkIGJ5IENvdW50cnksIGV2ZW4gdGhvdWdoIGluIHRoaXMgY2FzZSB3ZSBvbmx5IGhhdmUgb25lIGxpbmUgdG8gY29sb3IuIFRoZSBkZWZhdWx0IGNvbG9yIHdvdWxkIGJlIGEgc2FsbW9uIHBpbmsgY29sb3IsIGJ1dCB3ZSB3b3VsZCBsaWtlIHJlZC4gU28gd2Ugd2lsbCB1c2UgdGhlIGBzY2FsZV9jb2xvcl9tYW51YWwoKWAgZnVuY3Rpb24gdG8gbWFudWFsbHkgY2hvb3NlIHRoZSBjb2xvciB0aGF0IHdlIHdhbnQgYnkgdXNpbmcgYHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gYygicmVkIikpYC4gTm90aWNlIGhvdyB0aGUgY29sb3IgbmFtZSBuZWVkcyB0byBiZSBpbiBxdW90ZXMgYW5kIHRoYXQgdGhlIGFyZ3VtZW50IGB2YWx1ZXMgPWAgaXMgdXNlZCB0byBzcGVjaWZ5IHdoYXQgY29sb3IgdmFsdWVzIHRvIHVzZS4KCldlIGNhbiBhZGQgdGhpcyBsaW5lIHRvIHRoZSBwbG90IGluIHR3byB3YXlzLiBUaGUgZmlyc3Qgd2F5IGlzIHRvIGFkZCB0aGUgY29kZSBmb3IgdGhpcyBsYXllciB0byB0aGUgb3JpZ2luYWwgY29kZSB0aGF0IHdlIHVzZWQgdG8gY3JlYXRlIHRoZSBgY28ycGxvdGAgb3IgdGhlIHNlY29uZCB3YXkgaXMgdG8gc2ltcGx5IGFkZCB0byB0aGF0IHBsb3Qgb2JqZWN0IGJ5IHVzaW5nIHRoZSBgK2AuCgpgYGB7cn0KZGF0YV9sb25nICU+JQogIGZpbHRlcihJbmRpY2F0b3IgPT0gIkVtaXNzaW9ucyIpICU+JQogIGdncGxvdChhZXMoeCA9IFllYXIsIHkgPSBWYWx1ZSwgZ3JvdXAgPSBDb3VudHJ5KSkrCiAgZ2VvbV9saW5lKGFscGhhID0gMC40KSArIAogIGxhYnModGl0bGUgPSAiQ291bnRyeSIgfkNPWzJdfiAiRW1pc3Npb25zIHBlciBZZWFyLCAxNzUxLTIwMTQiLAogICAgIGNhcHRpb24gPSAiTGltaXRlZCB0byByZXBvcnRpbmcgY291bnRyaWVzIiwKICAgICAgICAgICB5ID0gIkVtaXNzaW9ucyAoTWV0cmljIFRvbnMpIikgKwogIGdlb21fbGluZShkYXRhID0gZGF0YV9sb25nICU+JQogIGZpbHRlcihJbmRpY2F0b3IgPT0gIkVtaXNzaW9ucyIsCiAgICAgICAgIENvdW50cnkgPT0gIlVuaXRlZCBTdGF0ZXMiKSwgYWVzKHg9WWVhciwgeT1WYWx1ZSwgY29sb3IgPSBDb3VudHJ5KSkgKwogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzPWMoInJlZCIpKSArCiAgdGhlbWVfbGluZWRyYXcoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwKICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLAogICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksCiAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwKICAgICAgIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLAogICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNiksCiAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCkpCgpjbzJwbG90ICsgZ2VvbV9saW5lKGRhdGEgPSBkYXRhX2xvbmcgJT4lCiAgZmlsdGVyKEluZGljYXRvciA9PSAiRW1pc3Npb25zIiwKICAgICAgICAgQ291bnRyeSA9PSAiVW5pdGVkIFN0YXRlcyIpLCBhZXMoeD1ZZWFyLCB5PVZhbHVlLCBjb2xvciA9IENvdW50cnkpKSArCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXM9YygicmVkIikpCmBgYAoKSXQgbG9va3MgbGlrZSB0aGUgVVMgaGFzIGxvbmcgYmVlbiB0aGUgbGFyZ2VzdCBDTzIgZW1pc3Npb24gcHJvZHVjaW5nIGNvdW50cnkgdW50aWwgcmVjZW50bHksIHdoZW4gdGhlIFVTIHdhcyBzdXJwYXNzZWQgYnkgYW5vdGhlciBjb3VudHJ5LiAKCkxldCdzIGZpZ3VyZSBvdXQgd2hpY2ggY291bnRyeSwgYnkgc2VlaW5nIHdoYXQgdGhlIHRvcCAxMCBlbWlzc2lvbiBwcm9kdWNpbmcgY291bnRyaWVzIHdlcmUgaW4gMjAxNC4gV2UgY2FuIGRvIHNvIGJ5IGZpbHRlcmluZyB0aGUgZGF0YSBmb3IgMjAxNCwgd2hpY2ggd2FzIHRoZSBmaW5hbCB5ZWFyIG9mIHRoZSBkYXRhLiBUaGVuIHdlIGNhbiBtYWtlIGEgcmFuayB2YXJpYWJsZSBiYXNlZCBvbiB0aGUgYFZhbHVlYCB2YXJpYWJsZSBmb3IgdGhlIGFtb3VudCBvZiBlbWlzc2lvbnMgcHJvZHVjZWQuIFRoZXJlIGFyZSBtYW55IGZ1bmN0aW9ucyBpbiB0aGUgYGRwbHlyYCBwYWNrYWdlIGZvciByYW5raW5nIHZhbHVlcyB0aGF0IGFyZSBiYXNlZCBvbiB0aGUgW1NRTF0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU1FMKXt0YXJnZXQ9Il9ibGFuayJ9IFtyYW5rIGZ1bmN0aW9uc10oaHR0cHM6Ly93d3cuc3Fsc2hhY2suY29tL292ZXJ2aWV3LW9mLXNxbC1yYW5rLWZ1bmN0aW9ucy8pe3RhcmdldD0iX2JsYW5rIn0uIFNRTCBpcyBhbm90aGVyIHByb2dyYW1taW5nIGxhbmd1YWdlIGZvciBtYW5hZ2luZyBsYXJnZSBhbW91bnRzIG9mIGRhdGEuIFRoZSBkaWZmZXJlbmNlIGluIHRoZSByYW5rIGZ1bmN0aW9ucyBtb3N0bHkgaGFzIHRvIGRvIHdpdGggaG93IHRvIGRlYWwgd2l0aCB0aWVzIGluIHRoZSBkYXRhLiAgV2Ugd2lsbCB1c2UgYGRlbnNlX3JhbmsoKWAsIGFzIHdlIGRvIG5vdCB3YW50IGdhcHMgYmV0d2VlbiByYW5rcy4KCmBgYHtyLCBlY2hvID0gRkFMU0UsIG91dC53aWR0aCA9ICI2MDAgcHgifQprbml0cjo6aW5jbHVkZV9ncmFwaGljcyhoZXJlOjpoZXJlKCJpbWciLCAicmFuay5wbmciKSkKYGBgCgpXZSB3YW50IHRvIGRvIHRoaXMgaW4gZGVzY2VuZGluZyBvcmRlciBiZWN1YXNlIHdlIHdhbnQgdG8gcmFuayBieSBsYXJnZXN0IHRvIHNtYWxsZXN0LCBzbyB3ZSB3aWxsIHVzZSB0aGUgYGRlc2MoKWAgZnVuY3Rpb24gb2YgdGhlIGBkcGx5cmAgcGFja2FnZS4gVGhlbiB3ZSB3aWxsIGFycmFuZ2UgdGhlIG91dHB1dCBieSByYW5rIHVzaW5nIHRoZSBgYXJyYW5nZSgpYCBmdW5jdGlvbiBvZiB0aGUgYGRwbHlyYCBwYWNrYWdlLiAKCmBgYHtyfQoKdG9wXzEwX2NvdW50IDwtZGF0YV9sb25nICU+JQogICAgZmlsdGVyKEluZGljYXRvcj09IkVtaXNzaW9ucyIpICU+JQogICAgZmlsdGVyKFllYXI9PTIwMTQpICU+JQogICAgbXV0YXRlKHJhbms9ZGVuc2VfcmFuayhkZXNjKFZhbHVlKSkpICU+JQogICAgZmlsdGVyKHJhbms8PTEwKSAlPiUKICAgIGFycmFuZ2UocmFuaykKCnRvcF8xMF9jb3VudAoKYGBgCldlIGNhbiBzZWUgdGhhdCBDaGluYSBpcyBub3cgdGhlIHRvcCBlbWlzc2lvbiBwcm9kdWNpbmcgY291bnRyeS4KCkxldCdzIG1ha2UgYSBwbG90IG9mIHRoZXNlIHRvcCBjb3VudHJpZXMuIFdlIG5lZWQgdG8gZmlsdGVyIHRoZSBkYXRhIHRvIGp1c3QgdGhlc2UgdG9wIGNvdW50cmllcyBieSB1c2luZyB0aGUgYCVpbiVgIG9wcGVyYXRvciB0byBvbmx5IGtlZXAgY291bnRyaWVzIGluIG91cmBDb3VudHJ5YCB2YXJpYWJsZSB0aGF0IGFyZSBhbHNvIGluIHRoZSBgQ291bnRyeWAgdmFyaWFibGUgd2l0aGluIGB0b3BfMTBfY291bnRgLiBXZSBjYW4gdXNlIHRoZSBgcHVsbCgpYCBmdW5jdGlvbiBhbHNvIGZvIHRoZSBgZHBseXJgIHBhY2thZ2UgdG8gc3BlY2lmaWNhbGx5IGdyYWIganVzdCB0aGUgYENvdW50cnlgIGRhdGEgb3V0IG9mIGB0b3BfMTBfY291bnRgLgoKClNpbmNlIHdlIGhhdmUgMTAgY291bnRyaWVzIHdlIHdpbGwgd2FudCB0byBkaWZmZXJlbnRpYXRlIHRoZW0gYnkgY29sb3IuIAoKVG8gY29sb3Igb3VyIHBsb3Qgd2Ugd2lsbCB1c2UgdGhlIHZpcmlkaXMgY29sb3IgcGFsbGV0dGUgd2hpY2ggaXMgY29tcGF0aWJsZSB3aXRoIGNvbG9yLWJsaW5kbmVzcyBieSB1c2luZyB0aGUgYHNjYWxlX2ZpbGxfdmlyaWRpc19kKClgIGZ1bmN0aW9uIHdoaWNoIGlzIHNpbXBseSBhdmFpbGFibGUgYnkgbG9hZGluZyB0aGUgYGdncGxvdDJgIHBhY2thZ2UuIFRoZXJlIGFyZSBhIGZldyB2YXJpYXRpb25zIHN1Y2ggYXMgZGlzY3JlZXQgYXMgYF9kYCwgb3IgYmlubmVkIGNvbnRpbnVvdXMgYXMgYF9iYCwgb3IgY29udGludW91cyBzY2FsZSBhcyBgX2NgLiBTZWUgW2hlcmVdKGh0dHBzOi8vZ2dwbG90Mi50aWR5dmVyc2Uub3JnL3JlZmVyZW5jZS9zY2FsZV92aXJpZGlzLmh0bWwpIGZvciBtb3JlIGluZm9ybWF0aW9uLgoKCmBgYHtyfQoKVG9wMTBiIDwtIGRhdGFfbG9uZyAlPiUKICBmaWx0ZXIoQ291bnRyeSAlaW4lIHB1bGwodG9wXzEwX2NvdW50LCBDb3VudHJ5KSkgJT4lCiAgZmlsdGVyKEluZGljYXRvciA9PSAiRW1pc3Npb25zIikgJT4lCiAgZmlsdGVyKFllYXIgPj0gMTkwMCkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gWWVhciwgeSA9IFZhbHVlLCBjb2xvciA9IENvdW50cnkpKSArCiAgZ2VvbV9saW5lKCkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXNfZCgpKwogIHRoZW1lX2xpbmVkcmF3KCkgKyAKICBsYWJzKHRpdGxlID0gIlRvcCAxMCBFbWlzc2lvbnMtcHJvZHVjaW5nIENvdW50cmllcyBpbiAyMDEwICgxOTAwLTIwMTQpIiwKICAgICAgIHN1YnRpdGxlID0gIk9yZGVyZWQgYnkgRW1pc3Npb25zIFByb2R1Y2VkIGluIDIwMTQiLAogICAgICAgeSA9ICJFbWlzc2lvbnMgKE1ldHJpYyBUb25zKSIsCiAgICAgICB4ID0gIlllYXIiKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwKICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLAogICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksCiAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwKICAgICAgIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLAogICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNikpCgpUb3AxMGIKCmBgYAoKSXQncyBzdGlsbCBhIGJpdCBkaWZmaWN1bHQgdG8gdGVsbCB3aGljaCBsaW5lIGNvcnJlc3BvbmRzIHRvIHdoaWNoIGNvdW50cnkuIFNvLCBsZXQncyBhZGQgYSBsYWJlbC4gT25lIHdheSB0byBkbyB0aGlzIGlzIHRvIGFkZCB0ZXh0IGxheWVyIHRvIG91ciBwbG90IHVzaW5nIHRoZSBgZ2VvbV90ZXh0KClgIGZ1bmN0aW9uIG9mIHRoZSBgZ2dwbG90MmAgcGFja2FnZS4gV2UgbmVlZCB0byBmaXJzdCBzcGVjaWZ5IHdoYXQgZGF0YSB3ZSB3aWxsIHVzZSwgaW4gdGhpcyBjYXNlIHdlIHdpbGwgZmlsdGVyIGZvciBqdXN0IHRoZSBkYXRhIGZvciB0aGUgbGFzdCB5ZWFyICh3aGljaCB3ZSBjYW4gZG8gdXNpbmcgdGhlIGBsYXN0KClgIGZ1bmN0aW9uIG9mIHRoZSBgZHBseXJgIHBhY2thZ2UpIGFuZCB0aGVuIHdlIG5lZWQgdG8gaW5kaWNhdGUgdGhhdCBvdXIgbGFiZWwgd2lsbCBiZSBiYXNlZCBvbiB0aGUgYENvdW50cnlgIHZhcmlhYmxlIHVzaW5nIHRoZSBgYWVzKClgIGFzdGhldGljcyBtYXBwaW5nIGFyZ3VtZW50LiBXZSB3aWxsIGFsc28gZ2V0IHJpZCBvZiBvdXIgbGVnZW5kIHNpbmNlIHdlIHdpbGwgbm90IG5lZWQgaXQgYW55bW9yZSwgYnkgdXNpbmcgdGhlIGB0aGVtZSgpYCBmdW5jdGlvbiBvZiB0aGUgYGdncGxvdDJgIHBhY2thZ2UuCgpgYGB7cn0KClRvcDEwYiArCmdlb21fdGV4dChkYXRhID0gZGF0YV9sb25nICU+JQogIGZpbHRlcihDb3VudHJ5ICVpbiUgcHVsbCh0b3BfMTBfY291bnQsIENvdW50cnkpKSAlPiUKICBmaWx0ZXIoSW5kaWNhdG9yID09ICJFbWlzc2lvbnMiKSAlPiUKICBmaWx0ZXIoWWVhciA9PSBsYXN0KFllYXIpKSwgYWVzKGxhYmVsID0gQ291bnRyeSkpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpCmBgYAoKTm90IGJhZCwgYnV0IHNvbWUgb2YgdGhlIGxhYmVscyBhcmUgb3ZlcmxhcHBpbmcgYW5kIGRpZmZpY3VsdCB0byByZWFkLiBXZSBjYW4gdXNlIHRoZSBgY2hlY2tfb3ZlcmxhcCA9IFRSVUVgIGFyZ3VtZW50IHdpdGhpbiB0aGUgYGdlb21fdGV4dCgpYCBmdW5jdGlvbiB0byByZW1vdmUgb3ZlcmxhcHBpbmcgdmFyaWFibGVzIGFuZCB3ZSBjYW4gZXhwYW5kIHRoZSBwbG90IGFyZWEgaG9yaXpvbnRhbGx5IHNvIHRoYXQgdGhlIG5hbWVzIGFyZSBub3QgY3V0b2ZmIGJ5IHVzaW5nIGBzY2FsZV94X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLjIsMCkpYC4KCmBgYHtyfQoKVG9wMTBiICsKZ2VvbV90ZXh0KGRhdGEgPSBkYXRhX2xvbmcgJT4lCiAgZmlsdGVyKENvdW50cnkgJWluJSBwdWxsKHRvcF8xMF9jb3VudCwgQ291bnRyeSkpICU+JQogIGZpbHRlcihJbmRpY2F0b3I9PSJFbWlzc2lvbnMiKSAlPiUKICBmaWx0ZXIoWWVhciA9PSBsYXN0KFllYXIpKSwgYWVzKGxhYmVsID0gQ291bnRyeSksIGNoZWNrX292ZXJsYXAgPSBUUlVFKSArIAogIHNjYWxlX3hfY29udGludW91cyhleHBhbmQgPSBjKDAuMiwwKSkrCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQoKYGBgCgpUaGlzIGlzIGVhc2llciB0byByZWFkIG5vdywgYnV0IGl0IGFsc28gY2F1c2VzIHVzIHRvIGxvc2Ugc29tZSBvZiB0aGUgbGFiZWxzLiAKVGhlcmUgYXJlIHNldmVyYWwgYWx0ZXJuYXRpdmUgd2F5cyB3ZSBjYW4ga2VlcCBhbGwgb2Ygb3VyIGxhYmVscyBhbmQgbWFrZSB0aGVtIGVhc2llciB0byByZWFkLiBUaGUgZmlyc3QgcGFja2FnZSB3ZSB3aWxsIHNob3cgaXMgY2FsbGVkIGBkaXJlY3RsYWJlbHNgLgoKVGhlIG1vc3Qgc2ltcGxlIG9wdGlvbiBpcyB0byB1c2UgdGhlIGBkaXJlY3QubGFiZWwoKWAgZnVuY3Rpb24uIHdoaWNoIHdpbGwgYXV0b21hdGljYWxseSBhZGQgbGFibGVzIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmVzLiBIb3dldmVyLCBpdCBpcyBhIGJpdCBkaWZmaWN1bHQgdG8gc2VlIHNvbWUgb2Ygb3VyIGxhYmVscyBhcyB0aGV5IGdldCBhdXRvbWF0aWNhbGx5IHNpemVkIHRvIGZpdCB0aGUgcGxvdC4KCgoKCmBgYHtyfQoKZGlyZWN0LmxhYmVsKFRvcDEwYikgK3NjYWxlX3hfY29udGludW91cyhleHBhbmQgPSBjKDAuMywwKSkKYGBgCgpBbHRlcm5hdGl2ZWx5IHRoaXMgY2FuIGJlIGRvbmUgaW4gYSBtb3JlIGBnZ3Bsb3QyYCBsYXllcmluZyBtZXRob2QgYnkgdXNpbmcgdGhlIGBnZW9tX2RsKClgIGZ1bmN0aW9uLgoKYGBge3J9CgpUb3AxMGIgK3NjYWxlX3hfY29udGludW91cyhleHBhbmQgPSBjKDAuMywwKSkgKwogICAgIGdlb21fZGwoYWVzKGxhYmVsID0gQ291bnRyeSksIG1ldGhvZCA9IGxpc3QoImxhc3QuYnVtcHVwIikpICsKICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpCmBgYAoKVGhpcyBpcyBuaWNlIGFuZCBsZWdpYmxlIG5vdy4gV2UgaGF2ZSBhbGwgMTAgY291bnRyaWVzIG5hbWVzIGxpc3RlZCBhbmQgdGhleSBhcmUgaW4gb3JkZXIgb2YgdGhlIGxhc3QgZGF0YSBwb2ludCBhbmQgdGhleSBhcmUgcmVsYXRpdmVseSBjbG9zZSB0byB0aGUgbGluZXMgdGhhdCB0aGV5IGNvcnJlc3BvbmQgdG8uIAoKQW5vdGhlciBvcHRpb24gaXMgdG8gdXNlIGEgZGlmZmVyZW50IG1ldGhvZCBpbiB0aGUgYGRpcmVjdGxhYmxlc2AgcGFja2FnZS4gW0hlcmVdKGh0dHA6Ly9kaXJlY3RsYWJlbHMuci1mb3JnZS5yLXByb2plY3Qub3JnL2RvY3MvaW5kZXguaHRtbCl7dGFyZ2V0PSJfYmxhbmsifSBpcyBhIGxpc3Qgb2Ygb3B0aW9ucy4KClRoZSBgImFuZ2xlZC5ib3hlcyJgIG1ldGhvZCBsb29rcyBuaWNlIGZvciBzb21lIHBsb3RzIGJ1dCBkb2Vzbid0IHdvcmsgdmVyeSB3ZWxsIGZvciBvdXIgcGxvdDoKYGBge3J9CmRpcmVjdC5sYWJlbChUb3AxMGIsIG1ldGhvZCA9IGxpc3QoImFuZ2xlZC5ib3hlcyIpKStzY2FsZV94X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLjMsMCkpIApgYGAKCkhvd2V2ZXIgdGhlIGAibGFzdC5wb2x5Z29ucyJgIG1ldGhvZCB3b3JrcyBxdWl0ZSB3ZWxsOgpgYGB7cn0KZGlyZWN0LmxhYmVsKFRvcDEwYixtZXRob2QgPSBsaXN0KCJsYXN0LnBvbHlnb25zIikpK3NjYWxlX3hfY29udGludW91cyhleHBhbmQgPSBjKDAuMywwKSkKYGBgClRoZSBzZWNvbmQgcGFja2FnZSBpcyB0aGUgYGdncmVwZWxgIHBhY2thZ2Ugd2hpY2ggaXMgZXNwZWNpYWxseSBnb29kIGZvciBjcm93ZGVkIGxhYmVscyB0aGF0IG1pZ2h0IG92ZXJsYXAgb25lIGFub3RoZXIuIEl0IGFsb3dzIGZvciBtb3JlIGNvbnRyb2wgdGhhbiB0aGUgYGRpcmVjdGxhYmVsc2AgcGFja2FnZS4gV2Ugd2lsbCB1c2UgdGhlIGBnZW9tX3RleHRfcmVwZWwoKWAgZnVuY3Rpb24uIEp1c3QgbGlrZSB3aXRoIGBnZW9tX3RleHRgLCBmaXJzdCB3ZSBuZWVkIHRvIHNwZWNpZnkgd2hhdCBkYXRhIHdlIHdhbnQgdG8gaW5jbHVkZS4gV2UgdGhlbiBzcGVjaWZ5IHdpdGggdGhlIGBhZXMoKWAgYXJndW1lbnQgdGhhdCBvdXIgbGFiZWwgd2lsbCBiZSBiYXNlZCBvbiB0aGUgYENvdW50cnlgIHZhcmlhYmxlIGFuZCB3ZSBhZ2FpbiBzcGVjaWZ5IHdoYXQgdmFyaWFibGUgdG8gdXNlIGZvciBvdXIgeCBheGlzIGFuZCB5IGF4aXMsIHNvIHRoYXQgd2UgaW5kaWNhdGUgd2hlcmUgdGhlIGxhYmVscyBzaG91bGQgYmUgcGxvdHRlZC4gCgpgYGB7cn0KClRvcDEwYiArIGdlb21fdGV4dF9yZXBlbChkYXRhID0gZGF0YV9sb25nICU+JQogIGZpbHRlcihDb3VudHJ5ICVpbiUgcHVsbCh0b3BfMTBfY291bnQsIENvdW50cnkpKSAlPiUKICBmaWx0ZXIoSW5kaWNhdG9yPT0iRW1pc3Npb25zIikgJT4lCiAgZmlsdGVyKFllYXIgPT0gbGFzdChZZWFyKSksCiAgICAgICAgICAgIGFlcyhsYWJlbCA9IENvdW50cnksCiAgICAgICAgICAgICAgICB4ID0gWWVhciwKICAgICAgICAgICAgICAgIHkgPSBWYWx1ZSkpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpK3NjYWxlX3hfY29udGludW91cyhleHBhbmQgPSBjKDAuMywwKSkKCmBgYApZb3UgY2FuIHNlZSB0aGF0IHRoaXMgcGFja2FnZSBjcmVhdGVzIHNlZ21lbnRzIHRoYXQgY29ubmVjdCB0aGUgbGFiZWwgdG8gdGhlIGxpbmUuCgpUaGVyZSBhcmUgbWFueSBhcmd1bWVudHMgdG8gdXNlIHRvIHN0eWxlIHlvdXIgbGFiZWxzIGp1c3QgdGhlIHdheSB0aGF0IHlvdSB3YW50OgoKYGBge3IsIGVjaG8gPSBGQUxTRSwgb3V0LndpZHRoID0gIjYwMCBweCJ9CmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKGhlcmU6OmhlcmUoImltZyIsICJnZ3JlcGVsLnBuZyIpKQpgYGAKClNlZSBbaGVyZV0oaHR0cHM6Ly9jcmFuLnItcHJvamVjdC5vcmcvd2ViL3BhY2thZ2VzL2dncmVwZWwvdmlnbmV0dGVzL2dncmVwZWwuaHRtbCl7dGFyZ2V0PSJfYmxhbmsifSBmb3IgbW9yZSBkZXRhaWxzLgoKCmBgYHtyfQoKVG9wMTBiICsgZ2VvbV90ZXh0X3JlcGVsKGRhdGEgPSBkYXRhX2xvbmcgJT4lCiAgZmlsdGVyKENvdW50cnkgJWluJSBwdWxsKHRvcF8xMF9jb3VudCwgQ291bnRyeSkpICU+JQogIGZpbHRlcihJbmRpY2F0b3I9PSJFbWlzc2lvbnMiKSAlPiUKICBmaWx0ZXIoWWVhciA9PSBsYXN0KFllYXIpKSwKICAgICAgICAgICAgYWVzKGxhYmVsID0gQ291bnRyeSwKICAgICAgICAgICAgICAgIHggPSBZZWFyLAogICAgICAgICAgICAgICAgeSA9IFZhbHVlKSwKICAgICAgICAgICAgbnVkZ2VfeCA9IDEwLAogICAgICAgICAgICAgIGhqdXN0ID0gMSwKICAgICAgICAgICAgICB2anVzdCA9IDEsCiAgICAgICBzZWdtZW50LnNpemUgPSAwLjI1LAogICAgICAgICAgICAgIGZvcmNlID0gMSkrCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSsKICBzY2FsZV94X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLjMsMCkpKwogIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAuMywwKSkKCmBgYApOaWNlLCB0aGF0IGxvb2tzIHByZXR0eSBnb29kLgoKTm93IGxldCdzIHRyeSBzaG93aW5nIG91ciBkYXRhIGluIGEgZGlmZmVyZW50IHdheS4gVGhpcyB0aW1lIHdlIHdpbGwgY3JlYXRlIGEgYGdlb21fdGlsZWAgcGxvdC4KVG8gY29sb3Igb3VyIHBsb3Qgd2Ugd2lsbCB1c2UgdGhlIHZpcmlkaXMgY29sb3IgcGFsbGV0dGUgYWdhaW4gIGJ1dCB0aGlzIHRpbWUgd2Ugd2lsbCB1c2UgdGhlIGBzY2FsZV9maWxsX3ZpcmlkaXNfYygpYCwgcmVjYWxsIHRoYXQgdGhlIGBfY2AgaW5kaWNhdGVzIGEgY29udGludW91cyBzY2FsZS4gU2VlIFtoZXJlXShodHRwczovL2dncGxvdDIudGlkeXZlcnNlLm9yZy9yZWZlcmVuY2Uvc2NhbGVfdmlyaWRpcy5odG1sKSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4gIEFnYWluLCB3ZSB3aWxsIGZpbHRlciBvdXIgZGF0YSB0byBpbmNsdWRlIG9ubHkgdGhlIENvdW50cmllcyBpbmNsdWRlZCBpbiB0aGUgYENvdW50cnlgIHZhcmlhYmxlIG9mIHRoZSBgdG9wXzEwX2NvdW50YC4gUmVjYWxsIHRoYXQgdGhlIGBwdWxsKClgIGZ1bmN0aW9uIHNwZWNpZmljYWxseSAgZ3JhYnMgdGhlIGBDb3VudHJ5YCB2YXJpYWJsZSBkYXRhIHZhbHVlcyB3aXRoaW4gYHRvcF8xMF9jb3VudGAuIFRoZW4gd2Ugd2lsbCB1c2UgdGhlIGBmY3RfcmVvcmRlcigpYCBmdW5jdGlvbiBvZiB0aGUgYGZvcmNhdHNgIHBhY2thZ2UgdG8gb3JkZXIgb3VyIGNvdW50cmllcyBiYXNlZCBvbiB0aGUgbGFzdCBlbWlzc2lvbiB2YWx1ZSBpbiAyMDE0LiAKClRvIHVzZSB0aGlzIGZ1bmN0aW9uLCB0aGUgdmFyaWFibGUgdGhhdCBpcyB0byBiZSByZW9yZGVyZWQgaXMgbGlzdGVkIGZpcnN0LCB0aGVuIHRoZSB2YXJpYWJsZSB0aGF0IGlzIGJlaW5nIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBvcmRlciwgZm9sbG93ZWQgYnkgYSBmdW5jdGlvbiB0byBkZXRlcm1pbmUgdGhlIG9yZGVyLCBpbiB0aGlzIGNhc2UgdGhlIGxhc3QgdmFsdWUgdXNpbmcgdGhlIGBsYXN0KClgIGZ1bmN0aW9uIChyZWNhbGwgdGhhdCB0aGlzIGlzIGFsc28gYSBmdW5jdGlvbiBvZiB0aGUgYGRwbHlyYCBwYWNrYWdlKS4KCmBgYHtyfQpUb3AxMDwtZGF0YV9sb25nICU+JQogIGZpbHRlcihDb3VudHJ5ICVpbiUgcHVsbCh0b3BfMTBfY291bnQsIENvdW50cnkpKSAlPiUKICBmaWx0ZXIoSW5kaWNhdG9yPT0iRW1pc3Npb25zIikgJT4lCiAgZmlsdGVyKFllYXI+PTE5MDApJT4lCiAgZ2dwbG90KGFlcyh4PVllYXIsIHk9ZmN0X3Jlb3JkZXIoQ291bnRyeSwgVmFsdWUsIGxhc3QpKSkgKwogIGdlb21fdGlsZSggYWVzKGZpbGw9bG9nKFZhbHVlKSkpICsKICBzY2FsZV9maWxsX3ZpcmlkaXNfYygpKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMTkwMCwyMDE0LGJ5PTUpLAogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBzZXEoMTkwMCwyMDE0LGJ5PTUpKSArIAogIGxhYnModGl0bGUgPSAiVG9wIDEwICJ+Q09bMl1+IkVtaXNzaW9uLXByb2R1Y2luZyBDb3VudHJpZXMgaW4gMjAxNCIsCiAgICBzdWJ0aXRsZSA9ICJPcmRlcmVkIGJ5IEVtaXNzaW9ucyBQcm9kdWNlZCBpbiAyMDE0IiwKICAgICAgICBmaWxsID0gIkxuKENPMiBFbWlzc2lvbnMgKE1ldHJpYyBUb25zKSkiKSArCiAgdGhlbWVfY2xhc3NpYygpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIsIGFuZ2xlID0gOTApLAogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksCiAgICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICBwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwKICAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYpLAogICAgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpCgpUb3AxMAoKYGBgCgpXZSBjYW4gYWxzbyBjcmVhdGUgdGhpcyBwbG90IGRpcmVjdGx5IHdpdGhvdXQgdXNpbmcgdGhlIGB0b3BfMTBfY291bnRgIHRpYmJsZSwgYnkgY3JlYXRpbmcgYSBuZXcgdmFyaWFibGUgZm9yIHRoZSBsYXN0IHZhbHVlIHRoYXQgd2Ugd2lsbCBjYWxsIGBsYXN0X3ZhbGAsIG9yIGluIG90aGVyIHdvcmRzIHRoZSBlbWlzc2lvbiB2YWx1ZSBpbiAyMDE0IGZvciBlYWNoIGNvdW50cnkuIFRvIGRvIHRoaXMgd2UgbmVlZCB0byBmaXJzdCB1c2UgdGhlIGBncm91cF9ieSgpYCBmdW5jdGlvbiBvZiB0aGUgYGRwbHlyYCBwYWNrYWdlIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBsYXN0IHZhbHVlIGlzIGNhbGN1bGF0ZWQgYW5kIHJlcGVhdGVkIGZvciBlYWNoIHJvdyBmb3IgYSBnaXZlbiBjb3VudHJ5LiBIZXJlIHlvdSBjYW4gc2VlIHRoYXQgdGhhdCBpcyB0aGUgY2FzZSBmb3IgQWZnaGFuaXN0YW4uCgoKYGBge3J9CgpkYXRhX2xvbmcgJT4lCiAgZmlsdGVyKEluZGljYXRvcj09IkVtaXNzaW9ucyIpICU+JQogIGZpbHRlcihZZWFyPj0xOTAwKSAlPiUKICBncm91cF9ieShDb3VudHJ5KSAlPiUKICBtdXRhdGUobGFzdF92YWwgPSBsYXN0KFZhbHVlKSkKYGBgCgpOb3cgd2Ugd2lsbCBhbHNvIGNyZWF0ZSBhIGByYW5rYCB2YXJpYWJsZSBsaWtlIHdlIGRpZCB3aGVuIHdlIGNyZWF0ZWQgYHRvcF8xMF9jb3VudGAgdGhhdCB3aWxsIGJlIGNhbGN1bGF0ZWQgYXMgdGhlIHJhbmsgb2YgdGhlIGNvdW50cmllcyBiYXNlZCBvbiB0aGUgYGxhc3RfdmFsYCB2YWx1ZSAoYWdhaW4gdGhpcyBpcyB0aGUgZW1pc3Npb24gdmFsdWUgaW4gdGhlIGxhc3QgeWVhciBvZiB0aGUgZGF0YSwgMjAxNCkuIE5vdyB3ZSB3YW50IHRvIHVuZ3JvdXAgb3VyIGRhdGEsIGFzIHdlIHdhbnQgdGhlIHJhbmsgdG8gYmUgY2FsY3VsYXRlZCBhY3Jvc3MgdGhlIGNvdW50cmllcy4gICAgIAoKYGBge3J9CgpkYXRhX2xvbmcgJT4lCiAgZmlsdGVyKEluZGljYXRvcj09IkVtaXNzaW9ucyIpICU+JQogIGZpbHRlcihZZWFyPj0xOTAwKSAlPiUKICBncm91cF9ieShDb3VudHJ5KSAlPiUKICBtdXRhdGUobGFzdF92YWwgPSBsYXN0KFZhbHVlKSkgJT4lCiAgdW5ncm91cCgpICU+JQogIG11dGF0ZShyYW5rPWRlbnNlX3JhbmsoZGVzYyhsYXN0X3ZhbCkpKSAlPiUKICBmaWx0ZXIocmFuazw9MTApIAoKYGBgCgpOb3cgd2UgY2FuIHB1dCBpdCBhbGwgdG9nZXRoZXIgdG8gY3JlYXRlIHRoZSBwbG90IGRpcmVjdGx5IGZyb20gYGRhdGFfbG9uZ2AuCgpgYGB7cn0KClRvcDEwPC1kYXRhX2xvbmcgJT4lCiAgZmlsdGVyKEluZGljYXRvciA9PSAiRW1pc3Npb25zIikgJT4lCiAgZmlsdGVyKFllYXIgPj0gMTkwMCkgJT4lCiAgZ3JvdXBfYnkoQ291bnRyeSkgJT4lCiAgbXV0YXRlKGxhc3RfdmFsID0gbGFzdChWYWx1ZSkpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBtdXRhdGUocmFuaz1kZW5zZV9yYW5rKGRlc2MobGFzdF92YWwpKSkgJT4lCiAgZmlsdGVyKHJhbms8PTEwKSAlPiUKICBnZ3Bsb3QoYWVzKHg9WWVhciwgeT1mY3RfcmVvcmRlcihDb3VudHJ5LCBWYWx1ZSwgbGFzdCkpKSArCiAgZ2VvbV90aWxlKCBhZXMoZmlsbD1sb2coVmFsdWUpKSkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpc19jKCkgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMTkwMCwyMDE0LGJ5PTUpLAogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBzZXEoMTkwMCwyMDE0LGJ5PTUpKSArIAogIGxhYnModGl0bGUgPSAiVG9wIDEwICJ+Q09bMl1+IkVtaXNzaW9uLXByb2R1Y2luZyBDb3VudHJpZXMgaW4gMjAxNCIsCiAgICBzdWJ0aXRsZSA9ICJPcmRlcmVkIGJ5IEVtaXNzaW9ucyBQcm9kdWNlZCBpbiAyMDE0IiwKICAgICAgICBmaWxsID0gIkxuKENPMiBFbWlzc2lvbnMgKE1nKSkiKSArCiAgdGhlbWVfY2xhc3NpYygpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIsIGFuZ2xlID0gOTApLAogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksCiAgICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICBwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwKICAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYpLAogICAgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpCgpUb3AxMApgYGAKV2UgY2FuIHNlZSB0aGF0IEdlcm1hbnkgaGFkIHZlcnkgbG93IGVtaXNzaW9uIHJhdGVzIGF0IHRoZSBlbmQgb2YgV29ybGQgV2FyIElJLiBXZSBzZWUgdGhhdCB0aGUgVVMgaGFzIGNvbnNpc3RlbnRseSBoYWQgaGlnaCBlbWlzc2lvbiByYXRlcyBzaW5jZSAxOTAwLCBidXQgdGhhdCB0aGUgZW1pc3Npb24gcmF0ZXMgaW4gQ2hpbmEgcmVjZW50bHkgc3VycGFzZWQgdGhhdCBvZiB0aGUgVVMuIFRoZSBwb3J0aW9ucyBvZiB0aGUgcGxvdCB0aGF0IGFyZSB3aGl0ZSBpbmRpY2F0ZSB0aGF0IHRoZXJlIGlzIG5vIGVtaXNzaW9uIGRhdGEgZm9yIHRoYXQgY291bnRyeS4KCk5vdyBsZXQncyB0YWtlIGEgbG9vayBhdCB0aGUgZGF0YSBpbiBzbGlnaHRseSBkaWZmZXJlbnQgd2F5LiBMZXQncyBsb29rIGF0IG92ZXJhbGwgZ2xvYmFsIGVtaXNzaW9ucyBieSBjYWxjdWxhdGluZyBhIHN1bSBlYWNoIHllYXIgb2YgYWxsIHRoZSBlbWlzc2lvbiB2YWx1ZXMgZm9yIHRoZSBkaWZmZXJlbnQgY291bnRyaWVzLiBOb3RlIHRoYXQgdGhpcyBpcyBsaW1pdGVkIHRvIG9ubHkgdGhlIGNvdW50cmllcyBpbmNsdWRlZCBpbiB0aGUgZGF0YXNldC4gCgpUbyBjYWxjdWxhdGUgdGhpcyB2YWx1ZSB3ZSB3aWxsIGZpcnN0IHVzZSB0aGUgYGdyb3VwX2J5KClgIGZ1bmN0aW9uIG9mIHRoZSBgZHBseXJgIHBhY2thZ2UuIFRoaXMgd2lsbCBhbGxvdyBvdXIgY2FsY2x1YXRpb24gdG8gYmUgcGVyZm9ybWVkIG9uIGFnZ3JlZ2F0ZWQgZGF0YSBieSB0aGUgZGlmZmVyZW50IHZhbHVlcyBmb3IgdGhlIGBZZWFyYCB2YXJpYWJsZS4gT3RoZXJ3aXNlLCB3ZSB3b3VsZCBzaW1wbHkgZ2V0IGEgc3VtIG9mIG92ZXJhbGwgZW1pc3Npb25zIGFjcm9zcyBhbGwgb2YgdGhlIHllYXJzIGluIHRoZSBkYXRhIHNldC4KClRoZW4gd2Ugd2lsbCB1c2UgdGhlIGBzdW1tYXJpemUoKWAgZnVuY3Rpb24gKGFsc28gb2YgdGhlIGBkcGx5cmAgcGFja2FnZSkgYW5kIHRoZSBiYXNlIGBzdW0oKWAgZnVuY3Rpb24gdG8gY2FsY3VsYXRlIGEgc3VtIG9mIHRoZSBlbWlzc2lvbiB2YWx1ZXMgZWFjaCB5ZWFyLgoKU2luY2Ugd2Ugd2lsbCBiZSBwbG90aW5nIG9ubHkgb25lIHZhbHVlIGVhY2ggeWVhciwgd2UgZG8gbm90IG5lZWQgdG8gYXNzaWduIGEgYGdyb3VwYCBpbiB0aGUgYGFlcygpYCBhcmd1bWVudC4gdGhpcyB0aW1lIHdlIHdpbGwgbWFrZSB0aGUgc2l6ZSBvZiB0aGUgbGluZSB0aGF0IHdpbGwgYmUgcGxvdHRlZCBhIGJpdCBsYXJnZXIgdXNpbmcgdGhlIGBzaXplKClgIGFyZ3VtZW50IGluIHRoZSBgZ2VvbV9saW5lKClgIGZ1bmN0aW9uLgoKYGBge3J9CkNPMl93b3JsZDwtZGF0YV9sb25nICU+JQogIGZpbHRlcihJbmRpY2F0b3IgPT0gIkVtaXNzaW9ucyIpICU+JQogIGdyb3VwX2J5KFllYXIpICU+JQogIHN1bW1hcml6ZShWYWx1ZSA9IHN1bShWYWx1ZSkpICU+JQogIGdncGxvdChhZXMoeCA9IFllYXIsIHkgPSBWYWx1ZSkpICsKICBnZW9tX2xpbmUoc2l6ZSA9IDEuNSkgKyAKICBsYWJzKHRpdGxlID0gIldvcmxkICJ+Q09bMl1+IiBFbWlzc2lvbnMgcGVyIFllYXIgLCAxNzUxLTIwMTQiLAogICAgIGNhcHRpb24gPSAiTGltaXRlZCB0byByZXBvcnRpbmcgY291bnRyaWVzIiwgCiAgICAgICAgICAgeSA9ICJFbWlzc2lvbnMgKE1ldHJpYyBUb25uZXMpIikgKwogIHRoZW1lX2xpbmVkcmF3KCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwKICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLAogICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksCiAgICAgICBwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwKICAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYpKQpDTzJfd29ybGQKCmBgYAoKT2ssIHdlIGNhbiBub3cgY2xlYXJseSBzZWUgdGhhdCBnbG9iYWwgQ08yIGVtaXNzaW9ucyBoYXZlIGRyYW1hdGljYWxseSByaXNlbiBzaW5jZSAxOTAwLgoKV2UgY2FuIG1ha2UgYW4gYW5uaW1hdGlvbiBvZiB0aGlzIHBsb3QgdXNpbmcgdGhlIGBnZ2FuaW1hdGVgIHBhY2thZ2UuCgpgYGB7ciwgQW5pbWF0aW9uXzEsIHdhcm5pbmc9RkFMU0UsIGV2YWw9VFJVRX0KYW5pbWF0aW9uXzEgPC0gZGF0YV9sb25nICU+JQogIGZpbHRlcihJbmRpY2F0b3IgPT0gIkRlYXRocyIpICU+JQogIGdncGxvdChhZXMoeCA9IFllYXIsIAogICAgICAgICAgICAgeSA9IFZhbHVlLCAKICAgICAgICAgZ3JvdXAgPSBDb3VudHJ5LCAKICAgICAgICAgY29sb3IgPSBSZWdpb24sIAogICAgICAgICAgc2l6ZSA9IFJlZ2lvbiwgCiAgICAgICAgIGFscGhhID0gUmVnaW9uKSkgKwogIGdlb21fcG9pbnQoKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIlJlZCIsIkJsYWNrIikpICsKICBzY2FsZV9hbHBoYV9tYW51YWwodmFsdWVzID0gYygwLjEsIDEpKSArCiAgIHNjYWxlX3NpemVfbWFudWFsKHZhbHVlcyA9IGMoMC4yNSwgMikpICsKICBsYWJzKHRpdGxlID0gIkRpc3RyaWJ1dGlvbiBvZiBJbmRpY2F0b3JzIGJ5IFllYXIgYW5kIFZhbHVlLCAxOTgwLTIwMTAiLAogICAgICAgICAgIHkgPSAiQ3J1ZGUgTW9ydGFsaXR5IFJhdGUiKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCkpICsgCiAgdGhlbWVfY2xhc3NpYygpICsKICB0cmFuc2l0aW9uX3RpbWUoYXMuaW50ZWdlcihZZWFyKSkgKwogIGdnYW5pbWF0ZTo6c2hhZG93X3dha2Uod2FrZV9sZW5ndGggPSAxLCBhbHBoYSA9IEZBTFNFKQoKZ2dhbmltYXRlOjphbmltYXRlKGFuaW1hdGlvbl8xLCBmcHMgPSAxMCwgZHVyYXRpb24gPSA1KQpgYGAKCgojIyBZZWFybHkgR3Jvd3RoIGluIEdEUCBwZXIgQ2FwaXRhICgxODAxIHRvIDIwMTkpCgpOb3cgd2Ugd2lsbCB0YWtlIGEgbG9vayBhIEdEUCBncm93dGggb2YgdmFyaW91cyBjb3VudHJpZXMKCmBgYHtyfQpkYXRhX2xvbmcgJT4lCiAgZmlsdGVyKEluZGljYXRvciA9PSAiR0RQIikgJT4lCiAgZ2dwbG90KGFlcyh4ID0gWWVhciwgeSA9IFZhbHVlLCBncm91cCA9IENvdW50cnkpKSArCiAgZ2VvbV9saW5lKGFscGhhID0gMC4yKSArIAogIGxhYnModGl0bGUgPSAiQ291bnRyeSBHRFAgR3Jvd3RoIHBlciBDYXBpdGEgcGVyIFllYXIgKEFubnVhbCAlKSwgMTgwMS0yMDE5IiwKICAgICBjYXB0aW9uID0gIkxpbWl0ZWQgdG8gcmVwb3J0aW5nIGNvdW50cmllcyIsCiAgICAgICAgICAgeSA9ICJHRFAgR3Jvd3RoIHBlciBDYXBpdGEgKEFubnVhbCAlKSIpICsKICBnZW9tX2xpbmUoZGF0YSA9IGRhdGFfbG9uZyAlPiUKICBmaWx0ZXIoSW5kaWNhdG9yID09ICJHRFAiLAogICAgICAgICAgIENvdW50cnkgPT0gIlVuaXRlZCBTdGF0ZXMiKSwgCiAgYWVzKHg9WWVhciwgeT1WYWx1ZSwgY29sb3IgPSBDb3VudHJ5KSkgKwogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzPWMoInJlZCIpKSArCiAgdGhlbWVfbGluZWRyYXcoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwKICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLAogICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksCiAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwKICAgICAgIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLAogICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNiksCiAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCkpCmBgYApXZSBjYW4gc2VlIHRoYXQgdGhlIHZhcmlhdGlvbiBpbiBHRFAgaGFzIGJlY29tZSBncmVhdGVyIG92ZXIgdGltZS4KCmBgYHtyfQpkYXRhX2xvbmcgJT4lCiAgZmlsdGVyKEluZGljYXRvciA9PSAiR0RQIiwKICAgICAgICAgWWVhciA+PSAxODAxKSAlPiUKICBncm91cF9ieShZZWFyKSAlPiUKICBzdW1tYXJpc2UoVmFsdWUgPSBtZWFuKFZhbHVlLCBuYS5ybSA9IFRSVUUpKSAlPiUKICBnZ3Bsb3QoYWVzKHg9WWVhciwgeT1WYWx1ZSkpICsKICBnZW9tX2xpbmUoKSArIAogIGxhYnModGl0bGUgPSAiTWVhbiBDb3VudHJ5IEdEUCBHcm93dGggcGVyIENhcGl0YSBwZXIgWWVhciAoQW5udWFsICUpLCAxODAxLTIwMTkiLAogICAgIGNhcHRpb24gPSAiTGltaXRlZCB0byByZXBvcnRpbmcgY291bnRyaWVzIiwgCiAgICAgICAgICAgeSA9ICJHRFAgR3Jvd3RoIHBlciBDYXBpdGEgKEFubnVhbCAlKSIpICsKICB0aGVtZV9saW5lZHJhdygpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLAogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksCiAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwKICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLAogICAgICAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksCiAgICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2KSkKYGBgCgojIyBFbmVyZ3kgVXNlIHBlciBQZXJzb24gKDE5NjAgdG8gMjAxNSkKCmBgYHtyfQpkYXRhX2xvbmcgJT4lCiAgZmlsdGVyKEluZGljYXRvciA9PSAiRW5lcmd5IikgJT4lCmdncGxvdChhZXMoeD1ZZWFyLCB5PSBWYWx1ZSwgZ3JvdXA9Q291bnRyeSkpICsKICBnZW9tX2xpbmUoYWxwaGEgPSAwLjIpICsgCiAgZ2VvbV9saW5lKGRhdGEgPSBkYXRhX2xvbmcgJT4lCiAgZmlsdGVyKEluZGljYXRvciA9PSAiRW5lcmd5IiwKICAgICAgICAgICBDb3VudHJ5ID09ICJVbml0ZWQgU3RhdGVzIiksIGFlcyh4PVllYXIsIHk9VmFsdWUsIGNvbG9yID0gQ291bnRyeSkpICsKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcz1jKCJyZWQiKSkgKwogIGxhYnModGl0bGUgPSAiQ291bnRyeSBFbmVyZ3kgVXNlIChrZyBvZiBPaWwgRXF1aXZhbGVudCBwZXIgQ2FwaXRhKSwgMTk2MCB0byAyMDE1IiwKICAgICBjYXB0aW9uID0gIkxpbWl0ZWQgdG8gcmVwb3J0aW5nIGNvdW50cmllcyIsIAogICAgICAgICAgIHkgPSAiRW5lcmd5IFVzZSAoa2cgb2YgT2lsIEVxdWl2YWxlbnQgcGVyIENhcGl0YSkiKSsKICB0aGVtZV9saW5lZHJhdygpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLAogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksCiAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwKICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLAogICAgICAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksCiAgICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwKICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSkKYGBgCgpMZXQncyBzZWUgd2hvIHRoZSB0b3AgY291bnRyaWVzIGFyZS4gRmlyc3QgbGV0J3MgdGFrZSBhIGxvb2sgYXQgdGhlIHllYXIgMjAwMCwgYW5kIHRoZW4gMjAxNC4KCmBgYHtyfQoKZGF0YV9sb25nICU+JQpmaWx0ZXIoSW5kaWNhdG9yID09ICJFbmVyZ3kiKSAlPiUKICBmaWx0ZXIoWWVhciA9PSAyMDAwKSAlPiUKIHNsaWNlX21heChWYWx1ZSwgbiA9IDEwKQoKCmRhdGFfbG9uZyAlPiUKZmlsdGVyKEluZGljYXRvciA9PSAiRW5lcmd5IikgJT4lCiAgZmlsdGVyKFllYXIgPT0gMjAxNCkgJT4lCiAgc2xpY2VfbWF4KFZhbHVlLCBuID0gMTApCgpgYGAKCgpgYGB7cn0KZGF0YV9sb25nICU+JQogIGZpbHRlcihJbmRpY2F0b3IgPT0gIkVuZXJneSIpICU+JQogIGdyb3VwX2J5KFllYXIpICU+JQogIHN1bW1hcmlzZShWYWx1ZSA9IHN1bShWYWx1ZSwgbmEucm0gPSBUUlVFKSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gWWVhciwgeSA9IFZhbHVlKSkgKwogIGdlb21fbGluZSgpICsgCiAgbGFicyh0aXRsZSA9ICJXb3JsZHdpZGUgRW5lcmd5IFVzZSAoa2cgb2YgT2lsIEVxdWl2YWxlbnQgcGVyIENhcGl0YSksIDE5NjAgdG8gMjAxNSIsCiAgICAgY2FwdGlvbiA9ICJMaW1pdGVkIHRvIHJlcG9ydGluZyBjb3VudHJpZXMiLAogICAgICAgICAgIHkgPSAiRW5lcmd5IFVzZSAoa2cgb2YgT2lsIEVxdWl2YWxlbnQgcGVyIENhcGl0YSkiKSArCiAgdGhlbWVfbGluZWRyYXcoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwKICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLAogICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksCiAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwKICAgICAgIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLAogICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSkpCmBgYAoKIyMgQ3J1ZGUgTW9ydGFsaXR5IFJhdGUKCmBgYHtyfQoKTW9ydGFsaXR5IDwtZGF0YV9sb25nICU+JQogIGZpbHRlcihJbmRpY2F0b3IgPT0gIkRlYXRocyIpICU+JQogIGdncGxvdChhZXMoeCA9IFllYXIsIHkgPSBWYWx1ZSwgZ3JvdXAgPSBDb3VudHJ5KSkgKwogIGdlb21fbGluZShhbHBoYSA9IDAuMikgKyAKICBnZW9tX2xpbmUoZGF0YSA9IGRhdGFfbG9uZyAlPiUKICBmaWx0ZXIoSW5kaWNhdG9yID09ICJEZWF0aHMiLAogICAgICAgICAgIENvdW50cnkgPT0gIlVuaXRlZCBTdGF0ZXMiLAogICAgICAgICAgICAgIFllYXIgPj0gMTk2MCwgCiAgICAgICAgICAgICAgWWVhciA8PSAyMDE5KSwgCiAgYWVzKHggPSBZZWFyLCB5ID0gVmFsdWUsIGNvbG9yID0gQ291bnRyeSkpICsKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcz1jKCJyZWQiKSkgKwogIGxhYnModGl0bGUgPSAiQ291bnRyeSBDcnVkZSBNb3J0YWxpdHkgUmF0ZSAocGVyIDEwMDAgUGVyc29ucyksIDE5NjAgdG8gMjAxOSIsCiAgICAgY2FwdGlvbiA9ICJMaW1pdGVkIHRvIHJlcG9ydGluZyBjb3VudHJpZXMiLAogICAgICAgICAgIHkgPSAiQ3J1ZGUgTW9ydGFsaXR5IFJhdGUgKHBlciAxMDAwIFBlcnNvbnMpIikgKwogIHRoZW1lX2xpbmVkcmF3KCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwKICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLAogICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksCiAgICAgICBwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwKICAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYpLAogICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpKQoKTW9ydGFsaXR5CgpgYGAKCkxldCdzIHRha2UgYSBsb29rIHRvIHNlZSB3aGljaCBjb3VudHJpZXMgYWNjb3VudCBmb3IgdGhlIGxhcmdlIHBlYWtzIGluIE1vcmFsaXR5IGluIHRoZSBsYXRlIDE5NzBzIGFuZCB0aGUgZWFybHkgMTk5MHMuIEl0J3MgYWx3YXlzIGEgZ29vZCBpZGVhIHRvIGNoZWNrIHlvdXIgZGF0YSBpZiB5b3Ugc2VlIGFub21vbGllcyBsaWtlIHRoaXMuIAoKYGBge3J9CmRhdGFfbG9uZyAlPiUKICBmaWx0ZXIoSW5kaWNhdG9yID09ICJEZWF0aHMiLCBZZWFyID09IDE5NzgpICU+JSAKICBzbGljZV9tYXgoVmFsdWUsIG4gPSAzKQpgYGAKCkxvb2tzIGxpa2UgQ2FtYm9kaWEgaXMgdGhlIGNvdW50cnkgd2l0aCB0aGUgbGFyZ2UgcGVhayBpbiB0aGUgbGF0ZSAxOTcwcy4gSWYgeW91IGxvb2sgdXAgdGhlIGhpc3Rvcnkgb2YgQ2FtYm9kaWEgZHVyaW5nIHRoaXMgdGltZSBwZXJpb2QsIHlvdSB3aWxsIHNlZSB0aGF0IHRoZSBwZWFrIHdlIGFyZSBzZWVpbmcgbWFrZXMgc2Vuc2UgYmVjYXVzZSBDYW1ib2RpYSBleHBlcmllbmNlZCBbd2FyXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9DYW1ib2RpYW5fQ2l2aWxfV2FyKXt0YXJnZXQ9Il9ibGFuayJ9IGFuZCBbZ2VuaWNpZGVdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0NhbWJvZGlhbl9nZW5vY2lkZSl7dGFyZ2V0PSJfYmxhbmsifSBkdXJpbmcgdGhpcyB0aW1lLiAKCmBgYHtyfQpkYXRhX2xvbmcgJT4lCiAgZmlsdGVyKEluZGljYXRvciA9PSAiRGVhdGhzIiwgWWVhciA9PSAxOTkzKSAlPiUgCiAgc2xpY2VfbWF4KFZhbHVlLCBuID0gMykKYGBgClJ3YW5kYSBpcyB0aGUgY291bnRyeSB3aXRoIHRoZSBwZWFrIGluIHRoZSBlYXJseSAxOTkwcy4gVGhpcyBhbHNvIG1ha2VzIHNlbnNlIGJlY2F1c2UgUndhbmRhIGV4cGVyaWVuY2VkIGEgW2NpdmlsIHdhcl0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvUndhbmRhbl9DaXZpbF9XYXIpe3RhcmdldD0iX2JsYW5rIn0gYXQgdGhpcyB0aW1lLiAKCldoYXQgYWJvdXQgbm93PyBXaGF0IGNvdW50cmllcyBoYXZlIHRoZSBoaWdoZXN0IHJhdGVzPwoKYGBge3J9CmRhdGFfbG9uZyAlPiUKICAgZmlsdGVyKEluZGljYXRvciA9PSAiRGVhdGhzIiwgWWVhciA9PSAyMDE3KSAlPiUgCiAgc2xpY2VfbWF4KFZhbHVlLCBuID0gMTApCmBgYApJdCBzZWVtcyB0aGF0IG1hbnkgZWFzdGVybiBldXJvcGVhbiBjb3VudHJpZXMgY3VycmVudGx5IGhhdmUgdGhlIGhpZ2hlc3QgbW9ydGFsaXR5IHJhdGVzLCBhcyB3ZWxsIGFzIFtMZXNvdGhvXShodHRwczovL2FwcHMud2hvLmludC9pcmlzL2JpdHN0cmVhbS9oYW5kbGUvMTA2NjUvMTM2OTEwL2Njc2JyaWVmX2xzb19lbi5wZGY7anNlc3Npb25pZD0yMjdEMkI1NjNGMTMzQUUyMDU0MDQ2ODg3RDJEOTA1RD9zZXF1ZW5jZT0xKXt0YXJnZXQ9Il9ibGFuayJ9LgoKTGV0J3MgbWFrZSBhIHBsb3Qgb2YganVzdCB0aGVzZSBjb3VudHJpZXM6CmBgYHtyfQpNb3J0YWxpdHkgPC1kYXRhX2xvbmcgJT4lCiAgZmlsdGVyKEluZGljYXRvciA9PSAiRGVhdGhzIikgJT4lCiAgZ3JvdXBfYnkoQ291bnRyeSkgJT4lCiAgbXV0YXRlKGxhc3RfdmFsID0gbGFzdChWYWx1ZSkpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBtdXRhdGUocmFuayA9IGRlbnNlX3JhbmsoZGVzYyhsYXN0X3ZhbCkpKSAlPiUKICBmaWx0ZXIocmFuayA8PSA1KSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBZZWFyLCB5ID0gVmFsdWUsIGNvbG9yID0gQ291bnRyeSkpICsKICBnZW9tX2xpbmUoKSArIAogIHNjYWxlX2NvbG9yX3ZpcmlkaXNfZCgpKwogIGxhYnModGl0bGUgPSAiQ291bnRyeSBDcnVkZSBNb3J0YWxpdHkgUmF0ZSAocGVyIDEwMDAgUGVyc29ucyksIDE5NjAgdG8gMjAxOSIsCiAgICAgY2FwdGlvbiA9ICJMaW1pdGVkIHRvIHJlcG9ydGluZyBjb3VudHJpZXMiLAogICAgICAgICAgIHkgPSAiQ3J1ZGUgTW9ydGFsaXR5IFJhdGUgKHBlciAxMDAwIFBlcnNvbnMpIikgKwogIHRoZW1lX2xpbmVkcmF3KCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwKICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLAogICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksCiAgICAgICBwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwKICAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYpLAogICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpKQoKZGlyZWN0LmxhYmVsKE1vcnRhbGl0eSwgbWV0aG9kID0gbGlzdCgiYW5nbGVkLmJveGVzIikpCgoKCmBgYApXaXRoIHRoZSBleGNlcHRpb24gb2YgTG9zb3Robywgd2UgY2FuIHNlZSB0aGF0IHRoZSBtb3J0YWxpdHkgcmF0ZSBhcHBlYXJzIHRvIGJlIHN0ZWFkaWx5IGluY3JlYXNpbmcgaW4gdGhlc2UgY291bnRyaWVzLiAKCldoYXQgY291bnRyaWVzIGhhdmUgdGhlIGxvd2VzdCByZXBvcnRlZCByYXRlcz8gV2UgY2FuIHNpbXBseSBhbHRlciBvdXIgcGxvdCBjb2RlIHRvIG5vdCB1c2UgdGhlIGRlc2NpbmRpbmcgdmFsdWUgdG8gcmFuayBtb3J0YWxpdHkuIAoKYGBge3J9Ck1vcnRhbGl0eSA8LWRhdGFfbG9uZyAlPiUKICBmaWx0ZXIoSW5kaWNhdG9yID09ICJEZWF0aHMiKSAlPiUKICBncm91cF9ieShDb3VudHJ5KSAlPiUKICBtdXRhdGUobGFzdF92YWwgPSBsYXN0KFZhbHVlKSkgJT4lCiAgdW5ncm91cCgpICU+JQogIG11dGF0ZShyYW5rID0gZGVuc2VfcmFuayhsYXN0X3ZhbCkpICU+JQogIGZpbHRlcihyYW5rIDw9IDUpICU+JQogIGdncGxvdChhZXMoeCA9IFllYXIsIHkgPSBWYWx1ZSwgY29sb3IgPSBDb3VudHJ5KSkgKwogIGdlb21fbGluZSgpICsgCiAgc2NhbGVfY29sb3JfdmlyaWRpc19kKCkrCiAgbGFicyh0aXRsZSA9ICJDb3VudHJ5IENydWRlIE1vcnRhbGl0eSBSYXRlIChwZXIgMTAwMCBQZXJzb25zKSwgMTk2MCB0byAyMDE5IiwKICAgICBjYXB0aW9uID0gIkxpbWl0ZWQgdG8gcmVwb3J0aW5nIGNvdW50cmllcyIsCiAgICAgICAgICAgeSA9ICJDcnVkZSBNb3J0YWxpdHkgUmF0ZSAocGVyIDEwMDAgUGVyc29ucykiKSArCiAgdGhlbWVfbGluZWRyYXcoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwKICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLAogICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksCiAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwKICAgICAgIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLAogICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNiksCiAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCkpCgpkaXJlY3QubGFiZWwoTW9ydGFsaXR5LCBtZXRob2QgPSBsaXN0KCJhbmdsZWQuYm94ZXMiKSkgKyAKICBzY2FsZV94X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLjMsMCkpCgoKCmBgYApMb29rcyBsaWtlIG1hbnkgY291bnRyaWVzIGluIHRoZSBQZXJzaWFuIEd1bGYgcmVnaW9uIGhhdmUgdGhlIGxvd2VzdCByYXRlcyBvZiBtb3J0YWxpdHkuIAoKTGV0J3MgbWFrZSBhIHBsb3Qgb2Ygc29tZSBvZiB0aGUgY291bnRyaWVzIHRoYXQgc2hvd2VkIHVudXNhbCBwYXR0ZXJucyBvdmVyIHRpbWUuIFdlIHdpbGwgaW5jbHVkZSB0aGUgVVMgZm9yIGNvbXBhcmlzb24uCgpgYGB7cn0KCmRhdGFfbG9uZyAlPiUKICBmaWx0ZXIoSW5kaWNhdG9yID09ICJEZWF0aHMiLAogICAgICAgICAgICBDb3VudHJ5ICVpbiUgYygiVW5pdGVkIFN0YXRlcyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAiUndhbmRhIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJDYW1ib2RpYSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAiUWF0YXIiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJ1bGdyaWEiKSklPiUKICBnZ3Bsb3QoYWVzKHggPSBZZWFyLCB5ID0gVmFsdWUsIGNvbG9yID0gQ291bnRyeSkpICsKICBnZW9tX2xpbmUoKSArIAogIGxhYnModGl0bGUgPSAiIENydWRlIE1vcnRhbGl0eSBSYXRlIChwZXIgMTAwMCBQZXJzb25zKSwgMTk2MCB0byAyMDE5IiwKICAgICBjYXB0aW9uID0gIkxpbWl0ZWQgdG8gcmVwb3J0aW5nIGNvdW50cmllcyIsCiAgICAgICAgICAgeSA9ICJDcnVkZSBNb3J0YWxpdHkgUmF0ZSAocGVyIDEwMDAgUGVyc29ucykiKSArCiAgdGhlbWVfbGluZWRyYXcoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwKICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLAogICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksCiAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwKICAgICAgIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLAogICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNikpCmBgYAoKV2UgY2FuIG1ha2UgYSBzaW1pbGFyIHBsb3Qgd2hlcmUgZWFjaCBjb3VudHJ5IGlzIHNob3duIHNpZGUgYnkgc2lkZSBieSB1c2luZyB0aGUgYGZhY2V0X2dyaWQoKWAgZnVuY3Rpb24gb2YgdGhlIGBnZ3Bsb3QyYCBwYWNrYWdlLiBXZSBuZWVkIHRvIGluZGljYXRlIHdoYXQgdmFyaWFibGUgd2Ugd291bGQgbGlrZSB0byB1c2UgdG8gZ3JvdXAgdGhlIGRhdGEgYnkgYW5kIGluZGljYXRlIGl0IHdpdGggdGhpcyBzeW1ib2wgYH5gLiBJZiB3ZSBpbmNsdWRlIGEgcGVyaW9kICh0byBpbmRpY2F0ZSBhbGwgb3RoZXIgdmFyaWFibGVzKSB3ZSBjYW4gY2hhbmdlIHRoZSBvcmllbnRhdGlvbiBvZiB0aGUgcGxvdHM6CgoxKSBgLn52YXJpYWJsZWAgcGxvdHMgdGhlIHN1YnBsb3RzIGhvcml6b250YWxseSAocGxvdCB0aGUgZmFjZXQgdmFyaWJsZSBsaWtlIHRoZSB4IGF4aXMpCjIpIGB2YXJpYWJsZSB+LmAgcGxvdHMgdGhlIHN1YnBsb3RzIHZlcnRpY2FsbHkgIChwbG90IHRoZSBmYWNldCB2YXJpYWJsZSBsaWtlIHRoZSB5IGF4aXMpCgpgYGB7cn0KCmRhdGFfbG9uZyAlPiUKICBmaWx0ZXIoSW5kaWNhdG9yID09ICJEZWF0aHMiLAogICAgICAgICAgICBDb3VudHJ5ICVpbiUgYygiVW5pdGVkIFN0YXRlcyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAiUndhbmRhIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJDYW1ib2RpYSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAiUWF0YXIiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJ1bGdhcmlhIikpJT4lCiAgZ2dwbG90KGFlcyh4ID0gWWVhciwgeSA9IFZhbHVlKSkgKwogIGdlb21fbGluZSgpICsgCiAgZmFjZXRfZ3JpZCgufiBDb3VudHJ5KSsKICBsYWJzKHRpdGxlID0gIiBDcnVkZSBNb3J0YWxpdHkgUmF0ZSAocGVyIDEwMDAgUGVyc29ucyksIDE5NjAgdG8gMjAxOSIsCiAgICAgY2FwdGlvbiA9ICJMaW1pdGVkIHRvIHJlcG9ydGluZyBjb3VudHJpZXMiLAogICAgICAgICAgIHkgPSAiQ3J1ZGUgTW9ydGFsaXR5IFJhdGUgKHBlciAxMDAwIFBlcnNvbnMpIikgKwogIHRoZW1lX2xpbmVkcmF3KCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwKICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLAogICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksCiAgICAgICBwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwKICAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYpKQpgYGAKCldlIGNhbiBzZWUgdGhhdCByZWNlbnRseSB0aGUgVVMgaGFzIGFjdHVhbGx5IGhhZCBoaWdoZXIgbW9ydGFsaXR5IHJhdGVzIHRoYW4gUndhbmRhIGFuZCBDYW1ib2RpYS4KCkxldCdzIHNlZSBob3cgdGhlIFVTIHJhbmtzLgoKYGBge3J9CmRhdGFfbG9uZyAlPiUKICBmaWx0ZXIoSW5kaWNhdG9yID09ICJEZWF0aHMiKSAlPiUKICAgICAgIGZpbHRlcihZZWFyID09IDIwMTQpICU+JQogIGdyb3VwX2J5KENvdW50cnkpICU+JQogIG11dGF0ZShsYXN0X3ZhbCA9IGxhc3QoVmFsdWUpKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgbXV0YXRlKHJhbmsgPSBkZW5zZV9yYW5rKGRlc2MobGFzdF92YWwpKSklPiUKICBmaWx0ZXIoQ291bnRyeSA9PSAiVW5pdGVkIFN0YXRlcyIpCgpgYGAKClRoZSBVUyByYW5rZWQgNjggb3V0IG9mIDIxMiBjb3VudHJpZXMgaW4gMjAxNC4gVGhpcyBtZWFucyB0aGF0IHJvdWdobHkgNzAlIG9mIHRoZSBjb3VudHJpZXMgaW5jbHVkZWQgaGFkIGxvd2VyIG1vcnRhbGl0eSByYXRlcyB0aGFuIHRoZSBVUy4gU2VlIFtoZXJlXShodHRwczovL3d3dy5oZWFsdGhzeXN0ZW10cmFja2VyLm9yZy9jaGFydC1jb2xsZWN0aW9uL21vcnRhbGl0eS1yYXRlcy11LXMtY29tcGFyZS1jb3VudHJpZXMvI2l0ZW0tb3ZlcmFsbC1hZ2UtYWRqdXN0ZWQtbW9ydGFsaXR5LXJhdGUtZGVjbGluZS0xOTgwLTIwMTUpe3RhcmdldD0iX2JsYW5rIn0gYW5kIFtoZXJlXShodHRwczovL3d3dy5kcnVnYWJ1c2UuZ292L2RydWctdG9waWNzL3RyZW5kcy1zdGF0aXN0aWNzL292ZXJkb3NlLWRlYXRoLXJhdGVzKXt0YXJnZXQ9Il9ibGFuayJ9IGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IG1vcnRhbGl0eSByYXRlcyBpbiB0aGUgVVMuIAoKIyMjIyB7LnF1ZXN0aW9uX2Jsb2NrfQpRdWVzdGlvbiBPcHBvcnR1bml0eQpIb3cgd291bGQgeW91IGRldGVybWluZSB0aGUgdG90YWwgbnVtYmVyIG9mIGNvdW50cmllcyByZXBvcnRpbmcgaW4gMjAxND8KIyMjIwoKTGV0J3Mgc2VlIHdoYXQgdGhlIG92ZXJhbGwgdHJlbmQgaW4gbW9ydGFsaXR5IGhhcyBiZWVuIG92ZXIgdGltZS4KYGBge3J9CgpkYXRhX2xvbmcgJT4lCiAgZmlsdGVyKEluZGljYXRvciA9PSAiRGVhdGhzIikgJT4lCiAgIGdyb3VwX2J5KFllYXIpICU+JQogIHN1bW1hcmlzZShWYWx1ZSA9IG1lYW4oVmFsdWUsIG5hLnJtID0gVFJVRSkpICU+JQogIGdncGxvdChhZXMoeCA9IFllYXIsIHkgPSBWYWx1ZSkpICsKICBnZW9tX2xpbmUoc2l6ZSA9IDEuNCkgKyAKICBsYWJzKHRpdGxlID0gIk1lYW4gQ291bnRyeSBDcnVkZSBNb3J0YWxpdHkgUmF0ZSAocGVyIDEwMDAgUGVyc29ucyksIDE5NjAgdG8gMjAxOCIsCiAgICAgY2FwdGlvbiA9ICJMaW1pdGVkIHRvIHJlcG9ydGluZyBjb3VudHJpZXMiLAogICAgICAgICAgIHkgPSAiQ3J1ZGUgTW9ydGFsaXR5IFJhdGUgKHBlciAxMDAwIFBlcnNvbnMpIikgKwogIHRoZW1lX2xpbmVkcmF3KCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwKICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLAogICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksCiAgICAgICBwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwKICAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYpKQogIApgYGAKV2UgY2FuIHNlZSB0aGF0IGRlc3BpdGUgc29tZSBjb3VudHJpZXMgd2l0aCBkaWZmZXJlbnQgcGF0dGVybnMgb2YgbW9ydGFsaXR5LCBvdmVyYWxsIHRoZSB3b3JsZCBoYXMgZXhwcmllbmNlZCBtdWNoIGxvd2VyIHJhdGVzIG9mIG1vcnRhbGl0eSB0aGFuIGluIHByZXZpb3VzIGRlY2FkZXMuCgojIyBVUyBEaXNhc3RlcnMKCk5vdyBsZXQncyB0YWtlIGEgbG9vayBhdCB0aGUgZGlzYXN0ZXIgZGF0YSBmb3IgdGhlIFVTLgoKYGBge3J9CgpkYXRhX2xvbmcgJT4lCiAgZmlsdGVyKEluZGljYXRvciA9PSAiRGlzYXN0ZXJzIikgJT4lCiAgZ2dwbG90KGFlcyh4ID0gWWVhciwgeSA9IFZhbHVlLCBncm91cCA9IENvdW50cnkpKSArCiAgZ2VvbV9saW5lKCkgKyAKICBsYWJzKHRpdGxlID0gIlVTIERpc2FzdGVycywgMTk4MCB0byAyMDE5IiwKICAgIHN1YnRpdGxlID0gIkRyb3VndGhzLCBGbG9vZHMsIEZyZWV6ZXMsIFNldmVyZSBTdG9ybXMuIFRyb3BpY2FsIEN5Y2xvbmVzLCBXaWxkZmlyZXMsIGFuZCBXaW50ZXIgU3Rvcm1zIiwgCiAgICAgICAgICAgeSA9ICJEaXNhc3RlciBDb3VudCIpICsKICB0aGVtZV9saW5lZHJhdygpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLAogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksCiAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwKICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLAogICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNikpCiAgCmBgYAogCiBJbiBnZW5lcmFsLCBpdCBhcHBlYXJzIHRoYXQgdGVtcGVyYXR1cmVzIGhhdmUgaW5jcmVhc2VkIG92ZXIgdGltZS4gV2UgY2FuIGFkZCBhbm90aGVyIGBnZ3Bsb3QyYCBsYXllciBieSB1c2luZyB0aGUgYGdlb21fc21vb3RoKClgIHRvIGFkZCBhIHRyZW5kIGxpbmUuIFRoZXJlIGFyZSBzZXZlcmFsIG1ldGhvZHMgdG8gZG8gdGhpcy4gV2Ugd2lsbCB1c2UgdGhlIGBsb2Vzc2AgbWV0aG9kIHdoaWNoIHN0YW5kcyBmb3I6IFtMb2NhbGx5IFdlaWdodGVkIFNtb290aGluZ10oaHR0cHM6Ly93d3cuc3RhdGlzdGljc2hvd3RvLmNvbS9sb3dlc3Mtc21vb3RoaW5nKXt0YXJnZXQ9Il9ibGFuayJ9LiBUaGlzIG1ldGhvZCBmaXRzIGEgdHJlbmQgdG8gdGhlIGRhdGEgYnV0IGRvZXMgbm90IGFzc3VtZSB0aGF0IHRoZSB0cmVuZCB3aWxsIGZpdCBhIHBhcnRpY3VsYXIgc2hhcGUuCiAKYGBge3J9CgpkYXRhX2xvbmcgJT4lCiAgZmlsdGVyKEluZGljYXRvciA9PSAiRGlzYXN0ZXJzIikgJT4lCiAgZ2dwbG90KGFlcyh4ID0gWWVhciwgeSA9IFZhbHVlLCBncm91cCA9IENvdW50cnkpKSArCiAgZ2VvbV9saW5lKCkgKyAKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG9lc3MiKSArCiAgbGFicyh0aXRsZSA9ICJVUyBEaXNhc3RlcnMsIDE5ODAgdG8gMjAxOSIsCiAgICBzdWJ0aXRsZSA9ICJEcm91Z3RocywgRmxvb2RzLCBGcmVlemVzLCBTZXZlcmUgU3Rvcm1zLiBUcm9waWNhbCBDeWNsb25lcywgV2lsZGZpcmVzLCBhbmQgV2ludGVyIFN0b3JtcyIsIAogICAgICAgICAgIHkgPSAiRGlzYXN0ZXIgQ291bnQiKSArCiAgdGhlbWVfbGluZWRyYXcoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwKICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLAogICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksCiAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwKICAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYpKQogIApgYGAKCldlIGNhbiBzZWUgdGhhdCB0aGUgcmF0ZSBvZiBkaXNhc3RlcnMgYXBwZWFycyB0byBiZSBpbmNyZWFzaW5nIG92ZXIgdGltZS4gVGhlIGFkZGVkIGdlb21fc21vb3RoIGxheWVyIGhhcyBhZGRlZCBhIGJsdWUgdHJlbmQgbGluZSB3aXRoIHRoZSBncmF5IGluZGljYXRpbmcgdGhlIGNvbmZpZGVuY2UgaW50ZXJ2YWwgb2YgdGhlIHRyZW5kIGxpbmUuIAoKQnV0IHdoYXQgaXMgYSBjb25maWRlbmNlIGludGVydmFsPwoKQSBjb25maWRlbmNlIGludGVydmFsIGdpdmVzIGFuIGVzdGltYXRlZCByYW5nZSBvZiB2YWx1ZXMgd2hpY2ggaXMgbGlrZWx5IHRvIGluY2x1ZGUgdGhlIHRydWUgdmFsdWVzIG9mIHRoZSBlbnRpcmUgcG9wdWxhdGlvbiAoZm9yIGV4YW1wbGUgYWxsIHdvbWVuIGluIHRoZSBVUykgaWYgd2UgYXJlIHVzaW5nIGp1c3QgYSBzbWFsbCBzYW1wbGUgKGZvciBleGFtcGxlIDIwMCB3b21lbiBpbiB0aGUgVVMgdGhhdCB0YWtlIGEgc3VydmV5KSBvZiB0aGUgZW50aXJlIHBvcHVsdGF0aW9uLiBTZWUgW2hlcmVdKGh0dHBzOi8vbWF0aGJpdHNub3RlYm9vay5jb20vQWxnZWJyYTEvU3RhdGlzdGljc0RhdGEvU1RQb3BTYW1wbGUuaHRtbCl7dGFyZ2V0PSJfYmxhbmsifSBmb3IgbW9yZSBleHBsYW5hdGlvbiBhYm91dCBzYW1wbGVzIGFuZCBwb3B1bGF0aW9ucy4KClRodXMgdGhlIGdyYXkgYXJlYSBzaG93cyBvdGhlciBwb3NzaWJsZSB0cmVuZCBsaW5lcyB0aGF0IG1heSBmaXQgdGhlIGRhdGEgb2YgdGhlIGFjdXRhbCBwb3B1bGF0aW9uLiAKCmBgYHtyLCBlY2hvID0gRkFMU0UsIG91dC53aWR0aCA9ICI4MDAgcHgifQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygnaHR0cHM6Ly9pMS53cC5jb20vd3d3LnJlYWwtc3RhdGlzdGljcy5jb20vd3AtY29udGVudC91cGxvYWRzLzIwMTIvMTIvY29uZmlkZW5jZS1wcmVkaWN0aW9uLWludGVydmFsLnBuZz93PTg2MCcpCmBgYAojIyMjW3NvdXJjZV0oaHR0cDovL3d3dy5yZWFsLXN0YXRpc3RpY3MuY29tL3JlZ3Jlc3Npb24vY29uZmlkZW5jZS1hbmQtcHJlZGljdGlvbi1pbnRlcnZhbHMvKXt0YXJnZXQ9Il9ibGFuayJ9CgpXZSBjb3VsZCB0aGluayBvZiBvdXIgZGF0YSBhcyB0aGUgZW50aXJlIHBvcHVsYXRpb24uIFdlIGhhdmUgdGhlIGFjdHVhbCBjb3VudHMgZm9yIHRoZSBudW1iZXIgb2YgZGlzYXN0ZXJzIChiYXNlZCBvbiBzcGVjaWZpYyBkZWZpbml0aW9ucyBvZiBkaXNhc3RlcnMpIHRoYXQgb2NjdXJlZCBpbiB0aGUgVVMgZWFjaCB5ZWFyIGZyb20gMTk4MCB0byAyMDEwLiBUaGVyZWZvcmUsIHdlIHdvdWxkIG5vdCBuZWVkIHRvIGNhbGN1bGF0ZSBjb25maWRlbmNlIGludGVydmFscyBzbyB3ZSBjYW4gcmVtb3ZlIHRoZW0gZnJvbSBvdXIgcGxvdCBieSB1c2luZyB0aGUgYHNlID0gRkFMU0VgIGFyZ3VtZW50IG9mIHRoZSBgZ2VvbV9zbW9vdGgoKWAgZnVuY3Rpb24gb2YgYGdncGxvdDJgLiBDb25maWRlbmNlIGludGVydmFscyBhcmUgcGxvdHRlZCBieSBkZWZhdWx0IGFzIGRhdGEgaXMgbW9yZSBvZnRlbiBmcm9tIGEgc21hbGwgc2FtcGxlIG9mIHRydWUgcG9wdWxhdGlvbnMgYW5kIHdlICB0cnkgdG8gZ2VuZXJhbGl6ZSBvdXIgdHJlbmRzIGJhc2VkIG91ciBzYW1wbGUgdG8gdGhlIHRydWUgcG9wdWxhdGlvbi4KCgpgYGB7cn0KCmRhdGFfbG9uZyAlPiUKICBmaWx0ZXIoSW5kaWNhdG9yID09ICJEaXNhc3RlcnMiKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBZZWFyLCB5ID0gVmFsdWUsIGdyb3VwID0gQ291bnRyeSkpICsKICBnZW9tX2xpbmUoKSArIAogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsb2VzcyIsIHNlID0gRkFMU0UpICsKICBsYWJzKHRpdGxlID0gIlVTIERpc2FzdGVycywgMTk4MCB0byAyMDE5IiwKICAgIHN1YnRpdGxlID0gIkRyb3VndGhzLCBGbG9vZHMsIEZyZWV6ZXMsIFNldmVyZSBTdG9ybXMuIFRyb3BpY2FsIEN5Y2xvbmVzLCBXaWxkZmlyZXMsIGFuZCBXaW50ZXIgU3Rvcm1zIiwgCiAgICAgICAgICAgeSA9ICJEaXNhc3RlciBDb3VudCIpICsKICB0aGVtZV9saW5lZHJhdygpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLAogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksCiAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwKICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLAogICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNikpCmBgYAoKCiMjIFVTIFRlbXBlcmF0dXJlCgpIb3cgYWJvdXQgbmF0aW9uYWwgYXZlcmFnZSB0ZW1wZXJhdHVyZXMgaW4gdGhlIFVTPwoKYGBge3J9CgpkYXRhX2xvbmcgJT4lCiAgZmlsdGVyKEluZGljYXRvciA9PSAiVGVtcGVyYXR1cmUiKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBZZWFyLCB5ID0gVmFsdWUsIGdyb3VwID0gQ291bnRyeSkpICsKICBnZW9tX2xpbmUoKSArIAogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsb2VzcyIsIHNlID0gRkFMU0UpICsKICBsYWJzKHRpdGxlID0gIlVTIEF2ZXJhZ2UgQW5udWFsIFRlbXBlcmF0dXJlLCAxODk1IHRvIDIwMTkiLAogICAgICAgICAgIHkgPSAgIlRlbXBlcmF0dXJlIChGYWhyZW5oZWl0KSIpICsKICB0aGVtZV9saW5lZHJhdygpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLAogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksCiAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwKICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLAogICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNikpCgpgYGAKVGVtcGVyYXR1cmVzIGFsc28gYXBwZWFyIHRvIGJlIHJpc2luZywgZXNwZWNpYWxseSBpbiB0aGUgbGFzdCAxMC0yMCB5ZWFycy4KCgoKCgojICoqRGF0YSBWaXN1YWxpemF0aW9uKioKKioqIAoKTm93IExldCdzIHRyeSBwdXR0aW5nIHNvbWUgb2YgdGhlIGRpZmZlcmVudCBkYXRhIHR5cGVzIHRvZ2V0aGVyIHRvZ2V0aGVyLiBXZSBoYXZlIHByZXZpb3VzbHkgdXNlZCBgZmFjZXRfZ3JpZCgpYCB0byBwbG90IG11bHRpcGxlIHN1YnBsb3RzIHNpbXVsdGFuZW91c2x5LiBOb3cgd2Ugd2lsbCB1c2UgdGhlIGBmYWNldF93cmFwKClgIGZ1bmN0aW9uIG9mIHRoZSBgZ2dwbG90MmAgcGFja2FnZSwgd2hpY2ggYWxzbyBwbG90cyBtdWx0aXBsZSBzdWJwbG90cyBzaW11bHRhbmVvdXNseSwgaG93ZXZlciBpdCBhbHNvIGFsbG93cyBmb3IgZGlmZmVyZW50IHNjYWxlcyBmb3IgdGhlIHktYXhpcyBvZiB0aGUgc3VicGxvdHMuIFRoaXMgaXMgcHJlZmVyYWJsZSBpbiB0aGlzIGNhc2UgYmVjdWFzZSBpdCBpcyBkaWZmaWN1bHQgdG8gc2VlIHRoZSBkYXRhIGlmIGFsbCB0aGUgc3VicGxvdHMgd2VyZSBwbG90dGVkIHdpdGggdGhlIHNhbWUgeS1heGlzIHNjYWxlLCBhcyB5b3UgY2FuIHNlZSBoZXJlOiAKCgpgYGB7cixmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9MTB9CmdncGxvdChkYXRhX2xvbmcsIGFlcyh4ID0gWWVhciwgeSA9IFZhbHVlLCBncm91cCA9IENvdW50cnkpKSArCiAgZ2VvbV9saW5lKGFscGhhID0gMC4yKSArIAogIGdlb21fbGluZShkYXRhID0gZGF0YV9sb25nICU+JQogIGZpbHRlcihDb3VudHJ5ID09ICJVbml0ZWQgU3RhdGVzIiksIAogIGFlcyh4ID0gWWVhciwgeSA9IFZhbHVlLCBjb2xvciA9IENvdW50cnkpKSArCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBjKCJyZWQiKSkgKwogIGZhY2V0X2dyaWQofkluZGljYXRvciwKICAgICAgICAgICAgIHNjYWxlcyA9ICJmcmVlX3kiKSsKICAgICAgICAgICAgICNuY29sID0gMSkgKwogIGxhYnModGl0bGUgPSAiRGlzdHJpYnV0aW9uIG9mIEluZGljYXRvcnMgYnkgWWVhciBhbmQgVmFsdWUiLCAKICAgICAgICAgICB5ID0gIkluZGljYXRvciBWYWx1ZSIpICsKICB0aGVtZV9saW5lZHJhdygpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLAogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksCiAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwKICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLAogICAgICAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksCiAgICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2KSwKICAgICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2LCBmYWNlID0gImJvbGQiKSkKYGBgCgpUbyB1c2UgYGZhY2V0X3dyYXAoKWAgd2l0aCB0aGUgb3B0aW9uIGZvciBhIGRpZmZlcmVudCB5LWF4aXMgc2NhbGUgZm9yIGVhY2ggc3VicGxvdCwgd2UgbmVlZCB0byBzZXQgdGhlIGBzY2FsZXNgIGFyZ21lbnQgZXF1YWwgdG8gYCJmcmVlX3kiYC4gV2UgY2FuIGFsc28gaW5kaWNhdGUgd2hlcmUgd2Ugd291bGQgbGlrZSB0aGUgbGFiZWwgZm9yIHRoZSBzdWJwbG90cyB0byBiZSBsb2NhdGVkIGJ5IHVzaW5nIHRoZSBgc3RyaXAucG9zaXRpb25gIGFyZ3VtZW50LiBOb3RpY2UgdGhhdCB3ZSBjYW4gY2hhbmdlIHRoZSBzaXplIG9yIHN0eWxlIG9mIHRoZSBmb250IGZvciB0aGVzZSBsYWJlbHMgdXNpbmcgdGhlIGBzdHJpcC50ZXh0ID1gIGFyZ3VtZW50IG9mIHRoZSBgdGhlbWUoKWAgZnVuY3Rpb24uIFdlIGNhbiBhbHNvIHNwZWNpZnkgaG93IG1hbnkgcm93cyBvciBjb2x1bW5zIHdlIHdvdWxkIGxpa2UgdGhlIHN1YnBsb3RzIHRvIGJlIHNob3duLiAKCgpgYGB7cixmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9MTB9CmdncGxvdChkYXRhX2xvbmcsIGFlcyh4ID0gWWVhciwgeSA9IFZhbHVlLCBncm91cCA9IENvdW50cnkpKSArCiAgZ2VvbV9saW5lKGFscGhhID0gMC4yKSArIAogIGdlb21fbGluZShkYXRhID0gZGF0YV9sb25nICU+JQogIGZpbHRlcihDb3VudHJ5ID09ICJVbml0ZWQgU3RhdGVzIiksIAogIGFlcyh4ID0gWWVhciwgeSA9IFZhbHVlLCBjb2xvciA9IENvdW50cnkpKSArCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBjKCJyZWQiKSkgKwogIGZhY2V0X3dyYXAoSW5kaWNhdG9yfi4sCiAgICAgICAgICAgICBzY2FsZXMgPSAiZnJlZV95IiwKICAgICAgICAgICAgIHN0cmlwLnBvc2l0aW9uID0gInJpZ2h0IiwKICAgICAgICAgICAgIG5jb2wgPSAxKSArCiAgbGFicyh0aXRsZSA9ICJEaXN0cmlidXRpb24gb2YgSW5kaWNhdG9ycyBieSBZZWFyIGFuZCBWYWx1ZSIsIAogICAgICAgICAgIHkgPSAiSW5kaWNhdG9yIFZhbHVlIikgKwogIHRoZW1lX2xpbmVkcmF3KCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwKICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLAogICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksCiAgICAgICBwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwKICAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYpLAogICAgICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYsIGZhY2UgPSAiYm9sZCIpKQpgYGAKCkhlcmUgd2Ugd2lsbCBmYWNldCBieSB0d28gdmFyaWFibGVzOiBgSW5kaWNhdG9yYCBhbmQgYFJlZ2lvbmAgKHdoaWNoIGlzIGlmIHRoZSBkYXRhIGlzIGZyb20gdGhlIFVTIG9yIG90aGVyIGNvdW50cmllcykuIEZpcnN0IHdlIHdpbGwgZml0ZXIgb3V0IHRoZSBkYXRhIGFib3V0IGRpc2FzdGVycyBhbmQgdGVtcGVyYXR1cmUgYXMgdGhpcyBpcyBvbmx5IGZvciB0aGUgVVMsIGJ5IHVzaW5nIHRoZSBgZmlsdGVyKClgIGZ1bmN0aW9uIGFuZCBgIT1gIHdoaWNoIGluZGljYXRlcyAibm90IGVxdWFsIHRvIi4gSW4gdGhpcyBjYXNlIHdlIHdhbnQgdG8gdXNlIGBmYWNldF9ncmlkKClgIGluc3RlYWQgb2YgYGZhY2V0X3dyYXAoKWAgc28gdGhhdCB0aGUgc2FtZSB5LWF4aXMgd2lsbCBiZSB1c2VkIGFjcm9zcyB0aGUgcm93cy4KCmBgYHtyLGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD0xMH0KZGF0YV9sb25nICU+JQogIGZpbHRlcihJbmRpY2F0b3IgIT0gIkRpc2FzdGVycyIgLAogICAgICAgICBJbmRpY2F0b3IgIT0gIlRlbXBlcmF0dXJlIikgICU+JQpnZ3Bsb3QoIGFlcyh4ID0gWWVhciwgeSA9IFZhbHVlLCBncm91cCA9IENvdW50cnkpKSArCiAgZ2VvbV9saW5lKCkgKyAKICBmYWNldF9ncmlkKEluZGljYXRvciB+IFJlZ2lvbiwKICAgICAgICAgICAgIHNjYWxlcyA9ICJmcmVlX3kiKSsKICBsYWJzKHRpdGxlID0gIkRpc3RyaWJ1dGlvbiBvZiBJbmRpY2F0b3JzIGJ5IFllYXIgYW5kIFZhbHVlIiwgCiAgICAgICAgICAgeSA9ICJJbmRpY2F0b3IgVmFsdWUiKSArCiAgdGhlbWVfbGluZWRyYXcoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwKICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLAogICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksCiAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwKICAgICAgIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLAogICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNiksCiAgICAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNiwgZmFjZSA9ICJib2xkIikpCmBgYAoKV2UgY2FuIGFsc28gdXNlICBgc2NhbGVzID0gImZyZWUiYCB3aXRoIGBmYWNldF93cmFwKClgIHRvIGhhdmUgYSBkaWZmZXJlbnQgYXhpcyBmb3IgZWFjaCBwbG90LgpgYGB7cixmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9MTB9CmRhdGFfbG9uZyAlPiUKICBmaWx0ZXIoSW5kaWNhdG9yICE9ICJEaXNhc3RlcnMiICwKICAgICAgICAgSW5kaWNhdG9yICE9ICJUZW1wZXJhdHVyZSIpICAlPiUKZ2dwbG90KCBhZXMoeCA9IFllYXIsIHkgPSBWYWx1ZSwgZ3JvdXAgPSBDb3VudHJ5KSkgKwogIGdlb21fbGluZSgpICsgCiAgZmFjZXRfd3JhcChJbmRpY2F0b3IgfiBSZWdpb24sCiAgICAgICAgICAgICBzY2FsZXMgPSAiZnJlZSIsIAogICAgICAgICAgICAgICBuY29sID0gMikrCiAgbGFicyh0aXRsZSA9ICJEaXN0cmlidXRpb24gb2YgSW5kaWNhdG9ycyBieSBZZWFyIGFuZCBWYWx1ZSIsIAogICAgICAgICAgIHkgPSAiSW5kaWNhdG9yIFZhbHVlIikgKwogIHRoZW1lX2xpbmVkcmF3KCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwKICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLAogICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksCiAgICAgICBwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwKICAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYpLAogICAgICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYsIGZhY2UgPSAiYm9sZCIpKQpgYGAKCgpGcm9tIHRoZXNlIHBsb3RzIHdlIGNhbiBzZWUgdGhhdCBlYWNoIHR5cGUgb2YgZGF0YSBzcGFucyBhIGRpZmZlcmVudCB0aW1lIHNwYW4uCgojIyBUaW1lIHNwYW5zIG9mIGRhdGEKCkxldCdzIHRha2UgYSBsb29rIGF0IHRoZSByZXBvcnRpbmcgY291bnRyaWVzIGZvciBlYWNoIHllYXIgZm9yIGVhY2ggdHlwZSBvZiBkYXRhIGZvciB0aGUgZ2xvYmFsIGluZGljYXRvcnMuIFRvIGNhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHJlcG9ydGluZyBjb3VudHJpZXMgd2Ugd2lsbCB1c2UgdGhlIGB0YWxseSgpYCBmdW5jdGlvbiBvZiB0aGUgYGRwbHlyYCBwYWNrYWdlIHRvIGdldCB0aGUgY291bnQgZm9yIGVhY2ggeWVhciBhbmQgaW5kaWNhdG9yLiBUaHVzIHdlIHdpbGwgZmlyc3QgZ3JvdXAgYnkgIHllYXIgYW5kIHRoZSBgTGFiZWxgIHZhcmlhYmxlIChhcyBhIHByb3h5IGZvciB0aGUgYEluZGljYXRvcmAgdmFyaWFibGUpLCBhcyB0aGlzIGFsc28gc3BlY2lmaWVzIHRoZSBkaWZmZXJlbnQgaW5kaWNhdG9ycyBidXQgd2l0aCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFuZCBmb3JtYXR0aW5nIHNvIHRoYXQgd2UgY2FuIGhhdmUgbmljZSBsYWJlbHMgaW4gb3VyIHBsb3QuCgpXZSBjYW4gYWRkIGFsc28gdmVydGljYWwgbGluZXMgdG8gb3VyIHBsb3QgdXNpbmcgdGhlIGBnZW9tX3ZsaW5lKClgIGZ1bmN0aW9uICBvZiB0aGUgYGdncGxvdDJgIHBhY2thZ2UuCgpgYGB7cn0KZGF0YV9sb25nICU+JQogICBmaWx0ZXIoSW5kaWNhdG9yICE9ICJEaXNhc3RlcnMiICYKICAgICAgICAgIEluZGljYXRvciAhPSAiVGVtcGVyYXR1cmUiKSAlPiUKICBncm91cF9ieShZZWFyLCBMYWJlbCwgLmRyb3A9RkFMU0UpICU+JQogIHRhbGx5KCkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gWWVhciwgeSA9IG4sIGNvbG9yID0gTGFiZWwpKSArCiAgZ2VvbV9saW5lKCkgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDE5ODAsIGxpbmV0eXBlID0gMiwgY29sb3IgPSAiYmxhY2siKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMjAxNCwgbGluZXR5cGUgPSAyLCBjb2xvciA9ICJibGFjayIpICsKICBsYWJzKHRpdGxlID0gIkNvdW50cmllcyB3aXRoIENvbXBsZXRlIERhdGEgcGVyIFllYXIiLAogICAgc3VidGl0bGUgPSAiR2xvYmFsIERhdGEiLCAKICAgICAgICAgICB5ID0gIkNvdW50cmllcyIpICsgCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgxNzUwLDIwMjAsYnk9MTApLAogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBzZXEoMTc1MCwyMDIwLGJ5PTEwKSkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApLAogICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLAogICAgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpICsKICB0aGVtZV9saW5lZHJhdygpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIsIGFuZ2xlID0gOTApLAogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksCiAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwKICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLAogICAgICAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksCiAgICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2KSwKICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSkKYGBgCgpXZSBjYW4gc2VlIHRoYXQgYWxsIG9mIG91ciBkYXRhIHNwYW5zIGZyb20gMTk4MCB0byAyMDE0LgoKV2hhdCBhYm91dCB0aGUgVVMgZGF0YT8KV2UgY2FuIHN1bW1hcml6ZSB0aGUgZGF0YSBiYXNlZCBvbiB0aGUgbWluaW11bSBhbmQgbWF4aW11bSBgWWVhcmAgdmFsdWUgdXNpbmcgdGhlIGBzdW1tYXJpemUoKWAgZnVuY3Rpb24uIFJlY2FsbCB0aGF0IHRoaXMgaXMgYSBmdW5jdGlvbiBvZiB0aGUgYGRwbHlyYCBwYWNrYWdlLgoKYGBge3J9CmRhdGFfbG9uZyAlPiUKICBmaWx0ZXIoQ291bnRyeSA9PSAiVW5pdGVkIFN0YXRlcyIpICU+JQogIGdyb3VwX2J5KExhYmVsKSAlPiUKICBzdW1tYXJpemUoRmlyc3RfeWVhcj0gbWluKFllYXIpLCBMYXN0X3llYXIgPSBtYXgoWWVhcikpCgpgYGAKTm93IHdlIHdpbGwgcGxvdCBhIHNlZ21lbnQgbGluZSBmb3IgdGhlIHNwYW4gdXNpbmcgYGdlb21fc2VnbWVudCgpYCBhbmQgcG9pbnRzIGZvciB0aGUgZmlyc3QgeWVhcnMgYW5kIGxhc3QgeWVhcnMgdXNpbmcgYGdlb21fcG9pbnQoKWAuIFRoaXMgdGltZSB3ZSB3aWxsIGFkZCBob3Jpem9udGFsIGxpbmVzIHVzaW5nIGBnZW9tX2hsaW5lKClgIHRvIHNob3cgd2hlcmUgdGhlIHRpbWUgc3BhbnMgb3ZlcmxhcC4KCmBgYHtyfQpkYXRhX2xvbmcgJT4lCiAgZmlsdGVyKENvdW50cnkgPT0gIlVuaXRlZCBTdGF0ZXMiKSAlPiUKICBncm91cF9ieShMYWJlbCkgJT4lCiAgc3VtbWFyaXplKEZpcnN0X3llYXIgPSBtaW4oWWVhciksIExhc3RfeWVhciA9IG1heChZZWFyKSkgJT4lCiAgZ2dwbG90KGFlcyh5ID0gTGFiZWwsIHggPSBMYXN0X3llYXIpKSArCiAgZ2VvbV9zZWdtZW50KGFlcyh5ID0gTGFiZWwsCiAgICAgICAgICAgICAgICB5ZW5kID0gTGFiZWwsCiAgICAgICAgICAgICAgICB4ZW5kID0gTGFzdF95ZWFyLAogICAgICAgICAgICAgICAgICAgeCA9IEZpcnN0X3llYXIgKSkgKwogIGdlb21fcG9pbnQoYWVzKHkgPSBMYWJlbCwgeCA9IEZpcnN0X3llYXIpKSArCiAgZ2VvbV9wb2ludChhZXMoeSA9IExhYmVsLCB4ID0gTGFzdF95ZWFyKSkgKyAKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAxOTgwLCBsaW5ldHlwZT0yKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMjAxNCwgbGluZXR5cGU9MikgKwogIGxhYnModGl0bGUgPSAiQ29tcGxldGUgRGF0YSBwZXIgWWVhciIsCiAgICBzdWJ0aXRsZSA9ICJVUy1zcGVjaWZpYyBEYXRhIiwgCiAgICAgICAgICAgeSA9ICJDb3VudHJpZXMiKSArIAogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMTc1MCwyMDIwLGJ5PTEwKSwKICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IHNlcSgxNzUwLDIwMjAsYnk9MTApKSArCiAgdGhlbWVfbGluZWRyYXcoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyLGFuZ2xlID0gOTApLAogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksCiAgICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICBwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwKICAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYpKQpgYGAKSXQgbG9va3MgbGlrZSB0aGUgb3ZlcmxhcHBpbmcgdGltZSBzcGFucyBmb3IgdGhlIGRpZmZlcmVudCBkYXRhc2V0cyBpcyBmcm9tIDE5ODAgdG8gMjAxNC4KCgoKYGBge3IsIEFuaW1hdGlvbl8yLCB3YXJuaW5nPUZBTFNFLCBldmFsPUZBTFNFfQphbmltYXRpb25fMiA8LSBkYXRhX2xvbmcgJT4lCiAgZmlsdGVyKEluZGljYXRvcj09IkVuZXJneSIpICU+JQogIGdncGxvdChhZXMoeCA9IFllYXIsIAogICAgICAgICAgICAgeSA9IFZhbHVlLCAKICAgICAgICAgZ3JvdXAgPSBDb3VudHJ5LCAKICAgICAgICAgY29sb3IgPSBSZWdpb24sIAogICAgICAgICAgc2l6ZSA9IFJlZ2lvbiwgCiAgICAgICAgIGFscGhhID0gUmVnaW9uKSkgKwogIGdlb21fcG9pbnQoKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIlJlZCIsIkJsYWNrIikpICsKICBzY2FsZV9hbHBoYV9tYW51YWwodmFsdWVzID0gYygwLjUsIDEpKSArCiAgIHNjYWxlX3NpemVfbWFudWFsKHZhbHVlcyA9IGMoMC4yNSwgMikpICsKICBsYWJzKHRpdGxlPSJEaXN0cmlidXRpb24gb2YgSW5kaWNhdG9ycyBieSBZZWFyIGFuZCBWYWx1ZSwgMTk4MC0yMDEwIiwKICAgICAgIHkgPSAiRW5lcmd5IFVzZSBwZXIgQ2FwaXRhIikgKwogIHRoZW1lX2NsYXNzaWMoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCkpICsgCiAgCiAgdHJhbnNpdGlvbl90aW1lKGFzLmludGVnZXIoWWVhcikpICsKICBzaGFkb3dfd2FrZSh3YWtlX2xlbmd0aCA9IDEsIGFscGhhID0gRkFMU0UpCgphbmltYXRlKGFuaW1hdGlvbl8yLCBmcHMgPSAxMCwgZHVyYXRpb24gPSA1KQoKYGBgCgoKYGBge3IsIEFuaW1hdGlvbl8zLCB3YXJuaW5nPUZBTFNFLCBldmFsPUZBTFNFfQphbmltYXRpb25fMyA8LSBkYXRhX2xvbmcgJT4lCiAgI2ZpbHRlcihUeXBlPT0iR2xvYmFsIikgJT4lCiAgZmlsdGVyKEluZGljYXRvcj09IkdEUCIpICU+JQogICNmaWx0ZXIoWWVhcj49MTk4MCkgJT4lCiAgI2ZpbHRlcihZZWFyPD0yMDEwKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBZZWFyLCAKICAgICAgICAgICAgIHkgPSBWYWx1ZSwgCiAgICAgICAgIGdyb3VwID0gQ291bnRyeSwgCiAgICAgICAgIGNvbG9yID0gUmVnaW9uLCAKICAgICAgICAgIHNpemUgPSBSZWdpb24sIAogICAgICAgICBhbHBoYSA9IFJlZ2lvbikpICsKICBnZW9tX3BvaW50KCkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJSZWQiLCJCbGFjayIpKSArCiAgc2NhbGVfYWxwaGFfbWFudWFsKHZhbHVlcyA9IGMoMC4xLCAxKSkgKwogICBzY2FsZV9zaXplX21hbnVhbCh2YWx1ZXMgPSBjKDAuMjUsIDIpKSArCiAgbGFicyh0aXRsZT0iRGlzdHJpYnV0aW9uIG9mIEluZGljYXRvcnMgYnkgWWVhciBhbmQgVmFsdWUsIDE5ODAtMjAxMCIsCiAgICAgICB5PSAiR0RQIEdyb3d0aCBwZXIgQ2FwaXRhICglKSIpICsKICB0aGVtZV9jbGFzc2ljKCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApKSArCiAgCiAgdHJhbnNpdGlvbl90aW1lKGFzLmludGVnZXIoWWVhcikpICsKICBzaGFkb3dfd2FrZSh3YWtlX2xlbmd0aCA9IDEsIGFscGhhID0gRkFMU0UpCgphbmltYXRlKGFuaW1hdGlvbl8zLCBmcHMgPSAxMCwgZHVyYXRpb24gPSA1KQpgYGAKCmBgYHtyLCBBbmltYXRpb25fNCwgd2FybmluZz1GQUxTRSwgZXZhbD1GQUxTRX0KYW5pbWF0aW9uXzQgPC0gZGF0YV9sb25nICU+JQogICNmaWx0ZXIoVHlwZT09Ikdsb2JhbCIpICU+JQogIGZpbHRlcihJbmRpY2F0b3I9PSJFbWlzc2lvbnMiKSAlPiUKICAjZmlsdGVyKFllYXI+PTE5ODApICU+JQogICNmaWx0ZXIoWWVhcjw9MjAxMCkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gWWVhciwKICAgICAgICAgICAgIHkgPSBWYWx1ZSwgCiAgICAgICAgIGdyb3VwID0gQ291bnRyeSwgCiAgICAgICAgIGNvbG9yID0gUmVnaW9uLCAKICAgICAgICAgIHNpemUgPSBSZWdpb24sIAogICAgICAgICBhbHBoYSA9IFJlZ2lvbikpICsKICBnZW9tX3BvaW50KCkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJSZWQiLCJCbGFjayIpKSArCiAgc2NhbGVfYWxwaGFfbWFudWFsKHZhbHVlcyA9IGMoMC4xLCAxKSkgKwogICBzY2FsZV9zaXplX21hbnVhbCh2YWx1ZXMgPSBjKDAuMjUsIDIpKSArCiAgbGFicyh0aXRsZSA9ICJEaXN0cmlidXRpb24gb2YgSW5kaWNhdG9ycyBieSBZZWFyIGFuZCBWYWx1ZSwgMTk4MC0yMDEwIiwKICAgICAgICAgICB5ID0gIkNPMiBFbWlzc2lvbnMgKE1nKSIpICsKICB0aGVtZV9jbGFzc2ljKCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApKSArCiAgdHJhbnNpdGlvbl90aW1lKGFzLmludGVnZXIoWWVhcikpICsKICBzaGFkb3dfd2FrZSh3YWtlX2xlbmd0aCA9IDEsIGFscGhhID0gRkFMU0UpCgphbmltYXRlKGFuaW1hdGlvbl80LCBmcHMgPSAxMCwgZHVyYXRpb24gPSA1KQpgYGAKCgoKCiMjIFVTLXNwZWNpZmljCgoKTGV0J3MgcGxvdCBhbGwgb2YgdGhlIFVTIGluZGljYXRvcnMgdG9nZXRoZXIuCgpgYGB7cn0KCgpVU19JbmRpY2F0b3JzIDwtIGRhdGFfbG9uZyAlPiUKICBmaWx0ZXIoQ291bnRyeT09IlVuaXRlZCBTdGF0ZXMiKSU+JQogIGZpbHRlcihZZWFyPj0xOTgwKSAlPiUKICBnZ3Bsb3QoYWVzKHg9WWVhciwgeT1WYWx1ZSkpICsgCiAgZ2VvbV9saW5lKCkgKyAKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG9lc3MiLCBzZSA9IEZBTFNFKSArCiAgZmFjZXRfd3JhcChMYWJlbH4uLCBuY29sPTIsIG5yb3c9Mywgc2NhbGVzID0gImZyZWVfeSIpICsgCiAgdGhlbWVfbGluZWRyYXcoKSArIAogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIHNpemUgPSAxMiksCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwKICAgICAgICBzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgc2l6ZSA9IDEyKSwKICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMikpICsgCiAgbGFicyh0aXRsZSA9ICJVUy1zcGVjaWZpYyBJbmRpY2F0b3JzIikKVVNfSW5kaWNhdG9ycwpgYGAKCldlIGNhbiBhbHNvIHBsb3QgdGhlIGRhdGEgd2l0aCBwb2ludHMgZm9yIHRoZSBpbmRpdnVhbCB2YWx1ZXMgcmF0aGVyIHRoYW4gYSBsaW5lIHVzaW5nIGBnZW9tX3BvaW50KClgLgoKCmBgYHtyfQpVU19JbmRpY2F0b3JzX3BvaW50IDwtIGRhdGFfbG9uZyAlPiUKICBmaWx0ZXIoQ291bnRyeT09IlVuaXRlZCBTdGF0ZXMiKSU+JQogIGZpbHRlcihZZWFyPj0xOTgwKSAlPiUKICBnZ3Bsb3QoYWVzKHg9WWVhciwgeT1WYWx1ZSkpICsgCiAgZ2VvbV9wb2ludCgpICsgCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxvZXNzIiwgc2UgPSBGQUxTRSkgKwogIGZhY2V0X3dyYXAoTGFiZWx+LiwgbmNvbD0yLCBucm93PTMsIHNjYWxlcyA9ICJmcmVlX3kiKSArIAogIHRoZW1lX2xpbmVkcmF3KCkgKyAKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBzaXplID0gMTIpLAogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksCiAgICAgICAgc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIsIHNpemUgPSAxMiksCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpKSArIAogIGxhYnModGl0bGUgPSAiVVMtc3BlY2lmaWMgSW5kaWNhdG9ycyIpClVTX0luZGljYXRvcnNfcG9pbnQKCmBgYAoKSWYgd2Ugd2FudCB0byByZWFsbHkgbG9vayBhdCBob3cgdHdvIGluZGljYXRvcnMgbWF5IHJlbGF0ZSB0byBlYWNob3RoZXIsIGl0IGlzIGltcG9yYW50IHRoYXQgYm90aCBkYXRhc2V0cyBzcGFuIHRoZSBzYW1lIGFtb3VudCBvZiB0aW1lLiBUaGVyZWZvcmUsIHdlIHdpbGwgbGltaXQgdGhpcyBwbG90IHRvIG9ubHkgdGhlIHllYXJzIHdoZXJlIHRoZSBkYXRhIG92ZXJsYXBzIGZvciBib3RoIENPMiBlbWlzc2lvbnMgYW5kIHRlbXBlcmF0dXJlLgoKYGBge3J9CmRhdGFfbG9uZyAlPiUKICBmaWx0ZXIoQ291bnRyeSA9PSAiVW5pdGVkIFN0YXRlcyIpICU+JQogIGZpbHRlcihZZWFyPj0xOTgwKSAlPiUKICBmaWx0ZXIoWWVhcjw9MjAxMCkgJT4lCiAgZmlsdGVyKEluZGljYXRvciA9PSAiRW1pc3Npb25zInwKICAgICAgICAgSW5kaWNhdG9yID09ICJUZW1wZXJhdHVyZSIpICU+JQogIGdncGxvdChhZXMoeD1ZZWFyLCB5PVZhbHVlKSkgKwogIGdlb21fbGluZSgpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG9lc3MiLCBzZSA9IEZBTFNFKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgxOTgwLDIwMTAsYnk9NSksCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IHNlcSgxOTgwLDIwMTAsYnk9NSkpICsgCiAgZmFjZXRfd3JhcChJbmRpY2F0b3J+Liwgc2NhbGVzID0gImZyZWVfeSIsIG5jb2w9MSkgKwogIHRoZW1lX2NsYXNzaWMoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCksCiAgICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSkgKyAKICBsYWJzKHRpdGxlPSJVUyBFbWlzc2lvbnMgYW5kIFRlbXBlcmF0dXJlcyAoMTk4MC0yMDEwKSIpCmBgYAoKV2UgY2FuIHNlZSB0aGF0IHRoZXJlIGFyZSB2ZXJ5IHNpbWlsYXIgcGF0dGVybnMgb2YgQ08yIGVtaXNzaW9uIGxldmVscyBhbiBhdmVyYWdlIGFubnVhbCB0ZW1wZXJhdHVyZXMuCldlIHdpbGwgYW5hbHl6ZSB0aGlzIGZ1cnRoZXIgaW4gYSBiaXQuIFRoZXJlIGFyZSBhbHNvIHNvbWUgb3RoZXIgY29tbW9uIHZpc3VhbGl6YXRpb24gdGVjaG5pcXVlcyB0aGF0IHV0aWxpemUgdGhlIG1lYW4gb2YgYSBzZXQgb2YgdmFsdWVzIG92ZXIgYSB0aW1lIHNwYW4gdG8gc2hvdyBob3cgdmFsdWVzIGFyZSBjaGFuZ2luZyBvdmVyIHRpbWUgaW4gYSBkaWZmZXJlbnQgd2F5LgoKClRvIGNyZWF0ZSBzdWNoIGEgdmlzdWFsaXphdGlvbiwgd2Ugd2lsbCBmaXJzdCBjYWxjdWxhdGUgdGhlIG1lYW4gb2Ygb3VyIEVtaXNzaW9uIGFuZCB0ZW1wZXJhdHVyZSB2YWx1ZXMgZnJvbSAxOTgwIHRvIDIwMTAgYW5kIGNyZWF0ZSBhIG5ldyB2YXJpYWJsZSBjYWxsZWQgYE1lYW5gLiBUaGVuIHdlIHdpbGwgY2FsY3VsYXRlIHRoZSBkaWZmZXJlbmNlIG9mIGVhY2ggdmFsdWUgZnJvbSB0aGUgbWVhbiBhbmQgY3JlYXRlIGEgbmV3IHZhcmlhYmxlIGZvciB0aGVzZSB2YWx1ZXMgY2FsbGVkIGBEaWZmX2Zyb21fbWVhbmAuIEZpbmFsbHkgd2Ugd2lsbCBhbHNvIGNyZWF0ZSBhIGZhY3RvciB2YXJpYWJsZSBhYm91dCB0aGUgc2lnbiBvZiB0aGUgYERpZmZfZnJvbV9tZWFuYCB2YWx1ZSB0byBkaXN0aW5ndWlzaCBwb3NpdGl2ZSBvciBuZWdhdGl2ZSBjaGFuZ2VzLiBXZSB3aWxsIHVzZSB0aGlzIHRvIGNvbG9yIG91ciBwbG90cy4KCmBgYHtyfQpkYXRhX2xvbmdfdXMgPC0gZGF0YV9sb25nICU+JQogIGZpbHRlcihDb3VudHJ5ID09ICJVbml0ZWQgU3RhdGVzIikgJT4lCiAgZmlsdGVyKFllYXIgPj0gMTk4MCwKICAgICAgICAgWWVhciA8PSAyMDEwKSAlPiUKICBncm91cF9ieShJbmRpY2F0b3IpICU+JQogIG11dGF0ZShNZWFuID0gbWVhbihWYWx1ZSksCiAgICAgIERpZmZfZnJvbV9tZWFuPSBWYWx1ZS1NZWFuKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgbXV0YXRlKERpZmZfY29sb3IgPSBzaWduKERpZmZfZnJvbV9tZWFuKSkgJT4lCiAgbXV0YXRlKERpZmZfY29sb3IgPSBhcy5mYWN0b3IoRGlmZl9jb2xvcikpCgoKYGBgCgoKYGBge3J9CmdsaW1wc2UoZGF0YV9sb25nX3VzKQpgYGAKCgoKT2ssIG5vdyB3ZSB3aWxsIGNyZWF0ZSBhIHBsb3QgdGhhdCBzaG93cyBhIGJhciBmb3IgdGhlIGNoYW5nZSBpbiBlYWNoIGluZGljYXRvciBmcm9tIHRoZSBtZWFuIHZhbHVlIGFjcm9zcyB0aGUgdGltZXNwYW4gZm9yIGVhY2ggeWVhci4KCmBgYHtyLCBmaWcud2lkdGg9NiwgZmlnLmhlaWdodD02fQpkYXRhX2xvbmdfdXMgJT4lCiAgZmlsdGVyKEluZGljYXRvciA9PSAiRW1pc3Npb25zInwKICAgICAgICAgSW5kaWNhdG9yID09ICJUZW1wZXJhdHVyZSJ8CiAgICAgICAgIEluZGljYXRvciA9PSAiRGlzYXN0ZXJzIikgJT4lCiAgZ2dwbG90KGFlcyh4PVllYXIsIHk9VmFsdWUpKSArCiAgZ2VvbV9zZWdtZW50KGFlcyh4PVllYXIsIHk9VmFsdWUsIHhlbmQ9WWVhciwgeWVuZD1NZWFuLCBjb2xvcj1EaWZmX2NvbG9yKSwgc2l6ZT0zLjI1KSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoImJsdWUiLCJyZWQiKSkgKyAKICBnZW9tX2hsaW5lKGFlcyh5aW50ZXJjZXB0PU1lYW4pLCBsaW5ldHlwZT0xLCBjb2xvcj0iYmxhY2siKSArCiAgZmFjZXRfd3JhcChJbmRpY2F0b3J+Liwgc2NhbGVzID0gImZyZWVfeSIsIG5jb2w9MSkgKyAKICB0aGVtZV9jbGFzc2ljKCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApLAogICAgICAgICBheGlzLnRpdGxlID0gZWxlbWVudF9ibGFuaygpLAogICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSAgKwogIGxhYnModGl0bGUgPSAiVVMgRGlzYXRlcnMsIEVtaXNzaW9ucywgYW5kIFRlbXBlcmF0dXJlcyAoMTk5MC0yMDEwKSIsCiAgICBzdWJ0aXRsZSA9ICJJbmRpY2F0b3IgTWVhbiBvZiAxOTkwLTIwMTAgUmVwcmVzZW50ZWQgYnkgU29saWQgQmxhY2sgTGluZSIpCmBgYApXZSBjYW4gc2VlIGZyb20gdGhpcyBwbG90IHRoYXQgb3ZlcmFsbCB0aGVyZSBoYXMgYmVlbiBhbiBpbmNyZWFzZSBpbiBEaXNhc3RlcnMsIEVtaXNzaW9ucyBhbmQgVGVtcGVyYXR1cmUgaW4gdGhlIG1vc3QgcmVjZW50IHllYXJzLiAKCldoYXQgaWYgd2UgbG9vayBhdCBtb3J0YWxpdHksIGdkcCwgYW5kIGRpc2FzdGVycyBpbiB0aGUgc2FtZSB3YXk/CgpgYGB7cn0KZGF0YV9sb25nX3VzICU+JQogIGZpbHRlcihJbmRpY2F0b3I9PSJEZWF0aHMifAogICAgICAgICBJbmRpY2F0b3I9PSJHRFAifAogICAgICAgICAgIEluZGljYXRvciA9PSJEaXNhc3RlcnMiKSAlPiUKICBnZ3Bsb3QoYWVzKHg9WWVhciwgeT1WYWx1ZSkpICsKICBnZW9tX3NlZ21lbnQoYWVzKHg9WWVhciwgeT1WYWx1ZSwgeGVuZD1ZZWFyLCB5ZW5kPU1lYW4sIGNvbG9yPURpZmZfY29sb3IpLCBzaXplPTMuMjUpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiYmx1ZSIsInJlZCIpKSArIAogIGdlb21faGxpbmUoYWVzKHlpbnRlcmNlcHQ9TWVhbiksIGxpbmV0eXBlPTEsIGNvbG9yPSJibGFjayIpICsKICBmYWNldF93cmFwKEluZGljYXRvcn4uLCBzY2FsZXMgPSAiZnJlZV95IiwgbmNvbD0xKSArIAogIHRoZW1lX2NsYXNzaWMoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCksCiAgICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X2JsYW5rKCksCiAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICArCiAgbGFicyh0aXRsZSA9ICJVUyBFbWlzc2lvbnMgYW5kIFRlbXBlcmF0dXJlcyAoMTk5MC0yMDEwKSIsCiAgICBzdWJ0aXRsZSA9ICJJbmRpY2F0b3IgTWVhbiBvZiAxOTkwLTIwMTAgUmVwcmVzZW50ZWQgYnkgU29saWQgQmxhY2sgTGluZSIpCgpgYGAKTHVja2lseSBhdCB0aGlzIHBvaW50IGRlcHNpdGUgaW5jcmVhc2VkIGRpc2FzdGVyIHJhdGVzLCBtb3J0YWxpdHkgYXBwZWFycyB0byBiZSBkZWNyZWFzaW5nLiBUaGUgR0RQIGhhcyBiZWVuIHJlbGF0aXZlbHkgY29uc2lzdGVudC4KCk5vdyBob3cgYWJvdXQgZW5lcmd5IHVzZSBhbmQgZW1pc3Npb25zPwoKYGBge3J9CmRhdGFfbG9uZ191cyAlPiUKICBmaWx0ZXIoSW5kaWNhdG9yPT0iRW1pc3Npb25zInwKICAgICAgSW5kaWNhdG9yID09ICJFbmVyZ3kiKSAlPiUKICBnZ3Bsb3QoYWVzKHg9WWVhciwgeT1WYWx1ZSkpICsKICBnZW9tX3NlZ21lbnQoYWVzKHg9WWVhciwgeT1WYWx1ZSwgeGVuZD1ZZWFyLCB5ZW5kPU1lYW4sIGNvbG9yPURpZmZfY29sb3IpLCBzaXplPTMuMjUpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiYmx1ZSIsInJlZCIpKSArIAogIGdlb21faGxpbmUoYWVzKHlpbnRlcmNlcHQ9TWVhbiksIGxpbmV0eXBlPTEsIGNvbG9yPSJibGFjayIpICsKICBmYWNldF93cmFwKEluZGljYXRvcn4uLCBzY2FsZXMgPSAiZnJlZV95IiwgbmNvbD0xKSArIAogIHRoZW1lX2NsYXNzaWMoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCksCiAgICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X2JsYW5rKCksCiAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICArCiAgbGFicyh0aXRsZSA9ICJVUyBFbWlzc2lvbnMgYW5kIEVuZXJneSBVc2UgKDE5OTAtMjAxMCkiLAogICAgc3VidGl0bGUgPSAiSW5kaWNhdG9yIE1lYW4gb2YgMTk5MC0yMDEwIFJlcHJlc2VudGVkIGJ5IFNvbGlkIEJsYWNrIExpbmUiKQoKYGBgCgpMb29rcyBsaWtlIGluIHZlcnkgcmVjZW50IHllYXJzLCB0aGVyZSBoYXMgYmVlbiBhIGRlY2xpbmUgaW4gYm90aCBlbmVyZ3kgdXNlIGFuZCBDTzIgZW1pc3Npb25zLgoKCgoKIyAqKkRhdGEgQW5hbHlzaXMqKgoqKioKCgpXZSBzZWUgdGhhdCBDTzIgZW1pc3Npb24gbGV2ZWxzLCBhbm51YWwgYXZlcmFnZSBuYXRpb25hbCB0ZW1wZXJhdHVyZXMsIGFuZCBkaXNhc3RlcnMgY291bnRzIGFwcGVhciB0byBiZSBpbmNyZWFzaW5nIG92ZXIgdGltZSwgYnV0IGhvdyBjYW4gd2UgYXNzZXNzIHRoaXMgc3RhdGlzdGljYWxseT8KCgojIyMgQ29ycmVsYXRpb24KCldlIGNhbiB1c2UgW2NvcnJlbGF0aW9uXShodHRwczovL3d3dy5tYXRoc2lzZnVuLmNvbS9kYXRhL2NvcnJlbGF0aW9uLmh0bWwpe3RhcmdldD0iX2JsYW5rIn0uIENvcnJlbGF0aW9uIGlzIGEgbWVhc3VyZSBvZiBzdHJlbmd0aCB0aGUgb2YgYSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0d28gdmFyaWFibGVzLiBPZnRlbiB3aGVuIHdlIGRlc2NyaWJlIGNvcnJlbGF0aW9uIHdlIGFyZSByZWZlcnJpbmcgdG8gbGluZWFyIGNvcnJlbGF0aW9uIGFuZCB0aGVyZWZvcmUgdGhlIGxpbmVhciByZWxhdGlvbnNoaXAgYmV0d2VlbiB2YXJpYWJsZXMuCgpJZiB3ZSBwbG90IG9uZSB2YXJpYWJsZSBvbiB0aGUgeC1heGlzIGFuZCB0aGUgb3RoZXIgdmFyaWFibGUgb24gdGhlIHktYXhpcywgd2UgY2FuIHNlZToKCjEpIHRoZSBzdHJlbmd0aCBvZiB0aGUgcmVsYXRpb25zaGlwIC0gYmFzZWQgb24gaG93IHdlbGwgdGhlIHBvaW50cyBmb3JtIGEgbGluZSAgCjIpIHRoZSBkaXJlY3Rpb24gb2YgdGhlIHJlbGF0aW9uc2hpcCAtIGJhc2VkIG9uIGlmIHRoZSBwb2ludHMgcHJvZ3Jlc3MgdXB3YXJkIG9yIGRvd253YXJkIAoKCklmIHRoZSB2YXJpYWJsZXMgcG9pbnQgdXB3YXJkIGluIGEgdmVyeSBjbGVhciBsaW5lLCB0aGVuIHRoZXJlIGlzIGEgc3Ryb25nIHBvc2l0aXZlIHJlbGF0aW9uc2hpcC4gSWYgdGhlIHBvaW50cyBkbyBub3QgcmVhbGx5IGZvcm0gYSBsaW5lLCB0aGVuIHRoZXJlIGlzIGEgd2VhayBsaW5lYXIgcmVhbHRpb25zaGlwIG9yIG5vIGxpbmVhciByZWxhdGlvbnNoaXAgLSB0aGVyZSBtYXkgaG93ZXZlciBiZSBhIG5vbmxpbmVhciByZWxhdGlvbnNoaXAgaWYgdGhlIHBvaW50cyBjcmVhdGUgYSBkaWZmZXJlbnQgYnV0IGRlZmluZWQgc2hhcGUuIFNlZSBbaGVyZV0oaHR0cHM6Ly90b3dhcmRzZGF0YXNjaWVuY2UuY29tL2VzdGltYXRpbmctbm9uLWxpbmVhci1jb3JyZWxhdGlvbi1pbi1yLTYyYzY1NzFjYjFkYil7dGFyZ2V0PSJfYmxhbmsifSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4gSWYgdGhlIHBvaW50cyBmb3JtIGEgZG93bndhcmQgc2xvcGluZyBsaW5lLCB0aGVuIHRoZXJlIGlzIGEgbmVnYXRpdmUgcmVsYXRpb25zaGlwLgoKCmBgYHtyLCBlY2hvID0gRkFMU0UsIG91dC53aWR0aCA9ICI4MDAgcHgifQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygnaHR0cHM6Ly93d3cubWF0aHNpc2Z1bi5jb20vZGF0YS9pbWFnZXMvY29ycmVsYXRpb24tZXhhbXBsZXMuc3ZnJykKYGBgCgojIyMjIFtzb3VyY2VdKGh0dHBzOi8vd3d3Lm1hdGhzaXNmdW4uY29tL2RhdGEvY29ycmVsYXRpb24uaHRtbCl7dGFyZ2V0PSJfYmxhbmsifQoKClRoZSBudW1iZXJzIGJlbGxvdyBlYWNoIHBsb3QgYWJvdmUgYXJlIGNhbGxlZCBjb3JyZWxhdGlvbiBjb2VmZmljaWVudHMuIFRoZXkgcmFuZ2UgZnJvbSAtMSB0byAxLiBBIHZhbHVlIG9mIHplcm8gaW5kaWNhdGVzIHRoYXQgdGhlcmUgaXMgbm8gY29ycmVsYXRpb24gYmV0d2VlbiB0aGUgdmFyaWFibGVzLiBXaGlsZSBhIHZhbHVlIG9mIDEgb3IgLTEgaW5kaWNhdGVzIHBlcmZlY3QgY29ycmVsYXRpb24sIHRoZSBjbG9zZXIgdGhlIGNvZWZmaWNpZW50IGlzIHRvIDEgb3IgLTEsIHRoZSBzdHJvbmdlciB0aGUgcmVsYXRpb25zaGlwLiBUaGUgc2lnbiBvZiB0aGUgY29lZmZmaWNpZW50IGluZGljYXRlcyB0aGUgZGlyZWN0aW9uIG9mIHRoZSByZWxhdGlvbnNoaXAuIElmIHRoZXJlIGlzIGEgbmVnYXRpdmUgcmVsYXRpb25zaGlwIHRoZW4gdGhlIHZhcmlhYmxlcyBzaG93IG9wcG9zaW5nIGNoYW5nZXMgZnJvbSBlYWNoIG90aGVyIC0gYXMgb25lIGdldHMgbGFyZ2VyIHRoZSBvdGhlciBnZXRzIHNtYWxsZXIuIElmIHRoZSBzaWduIGlzIHBvc2l0aXZlLCB0aGVuIHRoZSB2YXJpYWJsZXMgaW5jcmVhc2Ugc2ltaWxhcmx5LiAKCkxldCdzIHRha2UgYSBsb29rIGF0IG91ciBkYXRhIG5vdy4gV2UgaGF2ZSBhbHJlYWR5IHBsb3R0ZWQgb3VyIFVTIGluZGljYXRvcnMgYWNyb3NzIHRpbWUsIGJ1dCB3ZSBkaWQgbm90IGxvb2sgYXQgdGhlIGxpbmVhciB0cmVuZC4gV2Ugd2lsbCBkbyB0aGF0IG5vdyB1c2luZyBnZW9tX3BvaW50KCkgdG8gcGxvdCB0aGUgaW5kaXZpZHVhbCBkYXRhIHBvaW50cyBhbmQgdGhpcyB0aW1lIHdlIHdpbGwgdXNlIHRoZSBgImxtImAgbWV0aG9kIHdoaWNoIHN0YW5kcyBmb3IgbGluZWFyIG1ldGhvZCBmb3Igb3VyIGBnZW9tX3Ntb290aCgpYCBsYXllci4gCgpgYGB7cn0KVVNfSW5kaWNhdG9yc19sbSA8LSBkYXRhX2xvbmcgJT4lCiAgZmlsdGVyKENvdW50cnk9PSJVbml0ZWQgU3RhdGVzIiklPiUKICBmaWx0ZXIoWWVhcj49MTk4MCkgJT4lCiAgZ2dwbG90KGFlcyh4PVllYXIsIHk9VmFsdWUpKSArIAogIGdlb21fcG9pbnQoKSArIAogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gRkFMU0UpICsKICBmYWNldF93cmFwKExhYmVsfi4sIG5jb2w9MiwgbnJvdz0zLCBzY2FsZXMgPSAiZnJlZV95IikgKyAKICB0aGVtZV9saW5lZHJhdygpICsgCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgc2l6ZSA9IDEyKSwKICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLAogICAgICAgIHN0cmlwLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiLCBzaXplID0gMTIpLAogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSkgKyAKICBsYWJzKHRpdGxlID0gIlVTLXNwZWNpZmljIEluZGljYXRvcnMiKQpVU19JbmRpY2F0b3JzX2xtCmBgYAoKRmlyc3QgbGV0J3MgY3JlYXRlIGEgd2lkZSB0aWJibGUgZm9yIG91ciBVUyBkYXRhIHNvIHRoYXQgd2UgY2FuIHNpbWlsYXJseSBwbG90IG91ciBkYXRhLiBUbyBkbyB0aGlzIHdlIHdpbGwgY3JlYXRlIGEgd2lkZSB0aWJibGUgdXNpbmcgdGhlIGBwaXZvdF93aWRlcigpYCBmdW5jdGlvbiBvZiB0aGUgYGRwbHlyYCBwYWNrYWdlLiBUaGlzIGZ1bmN0aW9uIHJlcXVpcmVzIHZhbHVlcyBmb3IgdHdvIGFyZ3VtZW50cywgYG5hbWVzX2Zyb21gIGFuZCBgdmFsdWVzX2Zyb21gLiBUaGUgdmFyaWFibGUgdGhhdCBoYXMgdGhlIGluZGVudGl0eSBvciBsYWJlbHMgZm9yIHRoZSB2YWx1ZXMgdGhhdCB5b3Ugd2lzaCB0byBjcmVhdGUgbXVsdGlwbGUgbmV3IHZhcmlhYmxlcyBuYW1lcyBmcm9tIGlzIHVzZWQgZm9yIHRoZSBgbmFtZXNfZnJvbWAgYXJndW1lbnQuIFRoZSB2YXJpYWJsZSB0aGF0IGNvbnRhaW5zIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlcyBmb3IgdGhlIG5ldyB2YXJpYWJsZXMgaXMgdXNlZCBmb3IgdGhlIGB2YWx1ZXNfZnJvbWAgYXJndW1lbnQuCgpgYGB7cn0KCndpZGVfVVMgPC1kYXRhX2xvbmcgJT4lCiAgZmlsdGVyKENvdW50cnkgPT0gIlVuaXRlZCBTdGF0ZXMiKSAlPiUKICBmaWx0ZXIoWWVhcj49MTk4MCkgJT4lCiAgZmlsdGVyKFllYXI8PTIwMTApICU+JQogIHNlbGVjdCgtTGFiZWwpICU+JQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBJbmRpY2F0b3IsIHZhbHVlc19mcm9tID0gVmFsdWUpCgpgYGAKCgpgYGB7cn0Kd2lkZV9VUyAlPiUKZ2xpbXBzZSgpCmBgYAoKV2UgY2FuIHVzZSB0aGUgYGNvci50ZXN0KClgIG9mIHRoZSBgc3RhdHNgIHBhY2thZ2UgdG8gY2FsY3VsYXRlIHBlYXJzb24ncyBjb3JyZWxhdGlvbiBlc3RpbWF0ZXMsIGFzIHdlbGwgYXMgY29uZmlkZW5jZSBpbnRlcnZhbHMgZm9yIGNvcnJlbGF0aW9uIGVzdGltYXRlcy4gVGhpcyBmdW5jdGlvbiBhbGxvd3MgZm9yIGEgZmV3IGRpZmZlcmVudCBtZXRob2RzIHRvIGNhbGN1bGF0ZSBjb3JyZWxhdGlvbiBlc3RpbWF0ZXMuIFRoZSBkZWZhdWx0IGlzIHRoZSBbUGVhcnNvbidzIHByb2R1Y3QtbW9tZW50IG1ldGhvZF0oaHR0cDovL29ubGluZXN0YXRib29rLmNvbS8yL2Rlc2NyaWJpbmdfYml2YXJpYXRlX2RhdGEvcGVhcnNvbi5odG1sKXt0YXJnZXQ9Il9ibGFuayJ9LiBBbGwgdGhyZWUgbWV0aG9kcyByZXN1bHQgaW4gYSBjb3JyZWxhdGlvbiBjb2VmZmljaWVudCB0aGF0IHJhbmdlcyBmcm9tIC0xIHRvIDEgdGhhdCBpbmRpY2F0ZSB0aGUgc3RyZW5ndGggb2YgdGhlIGFzc29jaWF0aW9uIG9yIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSB2YXJpYWJsZXMuIEhvd2V2ZXIsIGVhY2ggbWV0aG9kIGhhcyBhIHNsaWdodGx5IGRpZmZlcmVudCBjYWxjdWxhdGlvbi4KClNlZSBbaGVyZV0oaHR0cHM6Ly93d3cuc3RhdGlzdGljc2hvd3RvLmNvbS9wcm9iYWJpbGl0eS1hbmQtc3RhdGlzdGljcy9jb3JyZWxhdGlvbi1jb2VmZmljaWVudC1mb3JtdWxhLyl7dGFyZ2V0PSJfYmxhbmsifSBhbmQgW2hlcmVdKGh0dHBzOi8vd3d3Lm5jYmkubmxtLm5paC5nb3YvcG1jL2FydGljbGVzL1BNQzM1NzY4MzAvKXt0YXJnZXQ9Il9ibGFuayJ9IGZvciBtb3JlIGluZm9ybWF0aW9uLgoKCkluIHRoZSBjYXNlIG9mIG91ciBkYXRhLCBpbmRpdmlkdWFsIHBvaW50cyB3b3VsZCBiZSB0aGUgbWVzdXJlbWVudHMgZm9yIGVhY2ggdmFyaWFibGUgYXQgZWFjaCB5ZWFyLgoKYGBge3J9CmNvcihwdWxsKHdpZGVfVVMsIFRlbXBlcmF0dXJlKSwgcHVsbCh3aWRlX1VTLCBZZWFyKSkKY29yKHB1bGwod2lkZV9VUywgRW1pc3Npb25zKSwgcHVsbCh3aWRlX1VTLCBZZWFyKSkKY29yKHB1bGwod2lkZV9VUywgRGlzYXN0ZXJzKSxwdWxsKHdpZGVfVVMsIFllYXIpKQpgYGAKCldlIGNhbiBzZWUgdGhhdCBpbiBhbGwgY2FzZXMsIHRoZXJlIGFwcGVhcnMgdG8gYmUgYSBwb3NpdGl2ZSBsaW5lYXIgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlIHRlc3RlZCBVUyBpbmRpY2F0b3JzIGFuZCB0aW1lLiBXZSBzZWUgdGhlIHJlbGF0aW9uc2hpcCBpcyBwb3NpdGl2ZSBiZWN1YXNlIHRoZSBjb3JyZWxhdGlvbiBlc3RpbWF0ZXMgYXJlIHBvc2l0aXZlIChhcyB3ZWxsIGFzIHRoZSBmYWN0IHRoYXQgb3VyIHBsb3RzIHNob3cgdXB3YXJkIGxpbmVhciByZWxhdGlvbnNoaXBzKS4gCgoKV2UgY2FuIGFzc2VzcyB0aGUgc3RyZW5ndGggb2YgdGhlIHJlbGF0aW9uc2hpcCBiYXNlZCBvbiB0aGlzIHRhYmxlIHdoaWNoIHByb3ZpZGVzIGdlbmVyYWwgZ3VpZGVsaW5lczoKCmBgYHtyfQprbml0cjo6aW5jbHVkZV9ncmFwaGljcyhoZXJlKCJpbWciLCAiZ3VpZGVzLnBuZyIpKQpgYGAKV2UgYWxzbyBzZWUgdGhhdCB0aGUgY29ycmVsYXRpb24gb2YgdGVtcGVyYXR1cmUgd2l0aCB0aW1lIGlzIGxvdywgaXQgaXMgdmVyeSBzdHJvbmcgZm9yIHRoZSBlbWlzc2lvbnMgZGF0YSwgYW5kIG1vZGVyYXRlIGZvciB0aGUgZGlzYXN0ZXIgZGF0YS4KCiMjIyBMaW5lYXIgUmVncmVzc2lvbgoKV2UgY2FuIGFsc28gdXNlIGEgW2xpbmVhciByZWdyZXNzaW9uXShodHRwOi8vc2l0ZXMudXRleGFzLmVkdS9zb3MvZ3VpZGVkL2luZmVyZW50aWFsL251bWVyaWMvYml2YXJpYXRlL2Nvci8jOn46dGV4dD1BJTIwY29ycmVsYXRpb24lMjBhbmFseXNpcyUyMHByb3ZpZGVzJTIwaW5mb3JtYXRpb24sdmFyaWFibGUlMjBiYXNlZCUyMG9uJTIwdGhlJTIwb3RoZXIuKXt0YXJnZXQ9Il9ibGFuayJ9IHRvIGV2YWx1YXRlIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBvdXIgdmFyaWFibGVzLiBUaGlzIGhlbHBzIHVzIHRvIGFuc3dlciBzbGlnaHRseSBkZWVwZXIgcXVlc3Rpb25zIGxpa2U6ICAKCkRvIGNoYW5nZXMgaW4gdGltZSBwcmVkaWN0IG9yIGV4cGxhaW4gY2hhbmdlcyBpbiB0ZW1wZXJhdHVyZSwgZW1pc3Npb24sIG9yIGRpc2FzdGVyIHZhbHVlcz8gIAoKV2UgY2FuIGdldCB0aGUgcmVzdWx0cyBmcm9tIGEgbGluZWFyIG1vZGVsIGJ5IHVzaW5nIHRoZSBiYXNlIGBzdW1tYXJ5KClgIGZ1bmN0aW9uIGFuZCB0aGUgYGxtKClgIGZ1bmN0aW9uIG9mIHRoZSBgc3RhdHNgIHBhY2thZ2UuIAoKVGhlIHZhcmlhYmxlIG9uIHRoZSBsZWZ0IG9mIHRoZSBgfmAgaW5kaWNhdGVzIHdoYXQgd2UgYXJlIHRyeWluZyB0byBwcmVkaWN0IGFsc28ga25vd24gYXMgdGhlIGRlcGVuZGVudCB2YXJpYWJsZSwgd2hpbGUgdGhlIHZhcmlhYmxlKHMpIG9uIHRoZSByaWdodCBhcmUgaW5kZXBlbmRlbnQuCgpgYGB7cn0Kc3VtbWFyeShsbShkYXRhID0gd2lkZV9VUywgVGVtcGVyYXR1cmUgfiBZZWFyKSkKc3VtbWFyeShsbShkYXRhID0gd2lkZV9VUywgRW1pc3Npb25zIH4gWWVhcikpCnN1bW1hcnkobG0oZGF0YSA9IHdpZGVfVVMsIERpc2FzdGVycyB+IFllYXIpKQpgYGAKSW4gYWxsIGNhc2VzLCB5ZXMgaXQgYXBwZWFycyB0aGF0IGFsbCBvZiB0aGVzZSBpbmRpY2F0b3JzIHNob3cgYSBwb3NpdGl2ZSBhc3NvY2lhdGlvbiAoZHVlIHRvIHBvc2l0aXZlIHQgdmFsdWUpIHdpdGggdGltZSAtIG1lYW5pbmcgdGhleSBzaG93IGFuIGluY3JlYXNlIG92ZXIgdGltZS4KCk5vdGljZSB0aGF0IHRoZSBgTXVsdGlwbGUgUi1zcXVhcmVkYCB2YWx1ZSBpbiB0aGUgb3V0cHV0IGlzIGVxdWFsIHRvIHRoZSBjb3JyZWxhdGlvbiBjb2VmZmljZWludCBzcXVhcmVkISAKClNpbmNlIENPMiBlbWlzc2lvbiBsZXZlbHMgYW4gYXZlcmFnZSBhbm51YWwgdGVtcGVyYXR1cmVzIGFwcGVhciB0byBoYXZlIHNpbWlsYXIgcGF0dGVybnMgb3ZlciB0aW1lLCB3ZSBtaWdodCB3YW50IHRvIGFuYWx5emUgaWYgdGhlc2UgdmFsdWVzIGFyZSBjb3JyZWxhdGVkIHdpdGggb25lIGFub3RoZXIuCgpXZSBtaWdodCBhbHNvIGFzazoKCkFyZSBlbWlzc2lvbiBsZXZlbHMgYXNzb2NpYXRlZCB3aXRoIHRlbXBlcmF0dXJlIGxldmVscyBvciBkaXNhc3RlciBsZXZlbHM/IENhbiB3ZSBwcmVkaWN0IG9yIGV4cGxhaW4gdGVtcGVyYXR1cmUgb3IgZGlzYXN0ZXIgbGV2ZWxzIGJhc2VkIG9uIGVtaXNzaW9uIGxldmVscz8KCkxldCdzIGZpcnN0IHBsb3QgYm90aCBvbiB0aGUgc2FtZSBwbG90LCB3aGVyZSBlbWlzc2lvbnMgd2lsbCBiZSBwbG90dGVkIG9uIG9uZSBheGlzIGFuZCB0ZW1wZXJhdHVyZXMgb24gdGhlIG90aGVyLgoKCmBgYHtyfQp3aWRlX1VTICU+JQogIGdncGxvdChhZXMoeD1FbWlzc2lvbnMsIHk9VGVtcGVyYXR1cmUpKSArCiAgZ2VvbV9saW5lKCkgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gRkFMU0UpICsKICB0aGVtZV9jbGFzc2ljKCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApLAogICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X2JsYW5rKCkpICsgCiAgbGFicyh0aXRsZT0iVVMgRW1pc3Npb25zIGFuZCBUZW1wZXJhdHVyZSAoMTk4MC0yMDEwKSIpCmBgYAoKYGBge3J9CndpZGVfVVMgJT4lCiAgZ2dwbG90KGFlcyh4PVRlbXBlcmF0dXJlLCB5PURpc2FzdGVycykpICsKICBnZW9tX2xpbmUoKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBGQUxTRSkgKwogIHRoZW1lX2NsYXNzaWMoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCksCiAgICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSkgKyAKICBsYWJzKHRpdGxlPSJVUyBEaXNhc3RlcnMgYW5kIFRlbXBlcmF0dXJlcyAoMTk4MC0yMDEwKSIpCmBgYAoKCmBgYHtyfQp3aWRlX1VTICU+JQogIGdncGxvdChhZXMoeD1FbWlzc2lvbnMsIHk9RGlzYXN0ZXJzKSkgKwogIGdlb21fbGluZSgpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IEZBTFNFKSArCiAgIAogIHRoZW1lX2NsYXNzaWMoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCksCiAgICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSkgKyAKICBsYWJzKHRpdGxlPSJVUyBFbWlzc2lvbnMgYW5kIERpc2FzdGVycyAoMTk4MC0yMDEwKSIpCmBgYAoKCk5vdyB3ZSBjYW4gY2FsdWN1bGF0ZSAgUGVhcnNvbiBjb3JyZWxhdGlvbiBjb2VmZmljaWVudHMuIAoKYGBge3J9CiAgCmNvcihwdWxsKHdpZGVfVVMsIEVtaXNzaW9ucyksCiAgICBwdWxsKHdpZGVfVVMsIFRlbXBlcmF0dXJlKSkKCmNvcihwdWxsKHdpZGVfVVMsIFRlbXBlcmF0dXJlKSwKICAgIHB1bGwod2lkZV9VUywgRGlzYXN0ZXJzKSkKCmNvcihwdWxsKHdpZGVfVVMsIEVtaXNzaW9ucyksCiAgICBwdWxsKHdpZGVfVVMsIERpc2FzdGVycykpCgpgYGAKCgoKQW5kIGZpbmFsbHkgcGVmb3JtIGxpbmVhciByZWdyZWVzc2lvbiBhbmFseXNpczoKCgoKYGBge3J9CnN1bW1hcnkobG0oZGF0YSA9IHdpZGVfVVMsIFRlbXBlcmF0dXJlIH4gRW1pc3Npb25zKSkKc3VtbWFyeShsbShkYXRhID0gd2lkZV9VUywgRGlzYXN0ZXJzIH4gVGVtcGVyYXR1cmUpKQpzdW1tYXJ5KGxtKGRhdGEgPSB3aWRlX1VTLCBEaXNhc3RlcnMgfiBFbWlzc2lvbnMpKQpgYGAKCkJvdGggdGVtcGVyYXR1cmUgYW5kIHRoZSBudW1iZXIgb2YgZGlzYXN0ZXJzIHBlciB5ZWFyIGFwcGVhciB0byBpbmNyZWFzZSB3aXRoIGluY3JlYXNlZCBDTzIgZW1pc3Npb25zLCBhcyB0aGUgcCB2YWx1ZSBpcyBsZXNzIHRoYW4gMC4wNSBpbiBib3RoIHJlZ3Jlc3Npb25zLiBIb3dldmVyLCB0aGUgbXVsdGlwbGUgUi1zcXVhcmVkIHZhbHVlLCBhbmQgcGVhcnNvbiBjb3JyZWxhdGlvbiBjb2VmZmljaWVudHMgd2VyZSBtb2RlcmF0ZSBmb3IgYm90aCByZWxhdGlvbnNoaXBzLiBTdWdnZXN0aW5nIHRoYXQgdGhlIHJlbGF0aW9uc2hpcCBpcyBub3QgdmVyeSBzdHJvbmcgYW5kIHRoYXQgdGhlcmUgYXJlIGxpa2VseSBvdGhlciBmYWN0b3JzIHRoYXQgaW5mbHVlbmNlIHRlbXBlcmF0dXJlIGFuZCBkaXNhc3RlcnMgYmVzaWRlcyBDMDIgZW1pc3Npb25zLiBUaGlzIG1ha2VzIHNlbnNlIHdpdGggd2hhdCB3ZSBrbm93IGFib3V0IHRoZSBlYXJ0aCdzIGF0bW9zcGhlcmUuIFRoZXJlIGFyZSBvdGhlciBncmVlbmhvdXNlIGdhc2VzIHRoYXQgY29udHJpYnV0ZSB0byB3YXJtaW5nIHRlbXBlcmF0dXJlcywgYW5kIHRoZSBleGlzdGluZyBDTzIgYWxyZWFkeSBpbiB0aGUgYXRtb3NwaGVyZSBhbHNvIHRyYXBzIGhlYXQgYW5kIGdyZWF0bHkgaW1wYWN0cyB0aGUgdGVtcGVyYXR1cmUuIEZ1cnRoZXJtb3JlIHdlIGFyZSBsb29raW5nIGF0IFVTIGVtaXNzaW9ucyBhbmQgaG93IHRoZXkgaW5mbHVlbmNlIFVTIHRlbXBlcmF0dXJlcywgYnV0IHRoZXJlIGFyZSBhbHNvIENPMiBlbWlzc2lvbnMgcHJvZHVjZWQgYnkgb3RoZXIgY291bnRyaWVzLiBUaGVyZSBhcmUgb3RoZXIgYXNwZWN0cyB0aGF0IGluZmx1ZW5jZSBkaXNhc3RlciByYXRlIGFzIHdlbGwsIHN1Y2ggdGhlIHJhdGUgb2YgaHVtaWRpdHkgbGV2ZWxzIGFuZCByYWluZmFsbCBmb3IgZmlyZXMuIAoKV2hpbGUgdGhlIGFuYWx5c2VzIHRoYXQgd2UgcGVyZm9ybWVkIGdpdmUgdXMgc29tZSBpbmRpY2F0aW9uIG9mIGhvdyB0aGVzZSBkaWZmZXJlbnQgZGF0YXNldHMgcmVsYXRlIHRvIG9uZSBhbm90aGVyLCBvbmUgd291bGQgcmVhbGlzdGljbHkgd2FudCB0byBwZXJmb3JtIGEgbWl4ZWQgZWZmZWN0cyBtb2RlbCBvciBncm93dGggY3VydmUgYW5hbHlzaXMgdG8gYWNjb3VudCBmb3IgdGhlIGZhY3QgdGhhdCB0aGVzZSBkYXRhIGFyZSBwYWlyZWQgYWNyb3NzIHRpbWVwb2ludHMgYW5kIG1heSB2YXJ5IGRpZmZlcmVudGx5IHdpdGggdGltZSBhbmQgdG8gaW5jbHVkZSB0aGVzZSBvdGhlciBmYWN0b3JzIHRoYXQgd2UganVzdCBkaXNjdXNzZWQuIC4uLiBBVk9DQURPIG5lZWRzIGxpbmtzIGV0Yy4gIGZlZWwgZnJlZSB0byBoZWxwIHRoaXMgc2VjdGlvbi4KCgoKCgpOb3cgd2Ugd2lsbCBjcmVhdGUgYSBwbG90IHRoYXQgc3VtbWFyaXplcyBvdXIgbWFqb3IgZmluZGluZ3MuIFdlIHdpbGwgdXNlIHRoZSBgcGxvdF9sYXlvdXQoKWAgZnVuY3Rpb24gb2YgdGhlIGBwYXRjaHdvcmtgIHBhY2thZ2UuCgpgYGB7ciwgb3V0LndpZHRoPSAiOTAwMHB4IiwgIm91dC5oZWlnaHQ9IDcwMDBweCJ9CihDTzJfd29ybGQgfCBUb3AxMCkvIFVTX0luZGljYXRvcnMKKENPMl93b3JsZCB8IFRvcDEwKS8gVVNfSW5kaWNhdG9ycyArCiAgcGxvdF9sYXlvdXQod2lkdGhzID0gYygxLCAyKSwgaGVpZ2h0cyA9IHVuaXQoYyg0LCA1KSwgYygnY20nLCAnbnVsbCcpKSkKCnBuZyhoZXJlOjpoZXJlKCJpbWciLCAibWFpbnBsb3QucG5nIiksIHdpZHRoID0gOTAwLCBoZWlnaHQgPSA3MDApCihDTzJfd29ybGQgfCBUb3AxMCkvIFVTX0luZGljYXRvcnMgKwogICAgcGxvdF9sYXlvdXQod2lkdGhzID0gYygxLCAyKSwgaGVpZ2h0cyA9IHVuaXQoYyg0LCA1KSwgYygnY20nLCAnbnVsbCcpKSkKZGV2Lm9mZigpCmBgYAoKCiMjICoqSG9tZXdvcmsqKgoKKioqCgpBc2sgc3R1ZGVudHMgdG8gY3JlYXRlIGEgcGxvdCB3aXRoIGxhYmVscyBzaG93aW5nIHRoZSBjb3VudHJpZXMgd2l0aCB0aGUgbG93ZXN0IENPMiBlbWlzc2lvbiBsZXZlbHMuCgpBc2sgc3R1ZGVudHMgdG8gcGxvdCBlbmVyZ3kgdXNlIGFuZCBlbWlzc2lvbnMgb24gYSBzY2F0dGVyIHBsb3QsIGNhbGN1bGF0ZSB0aGUgcGVhcnNvbiBjb3JyZWxhdGlvbiBjb2VmZmVjaWVudCwgYW5kIGRpc2N1c3Mgd2hhdCB0aGUgcmVzdWx0cyBtZWFuLiAKCiMjICoqU3VtbWFyeSoqCgpFdmVuIHRob3VnaCAgdGhlcmUgaXMgcXVpdGUgYSBiaXQgb2Ygc2NpZW50aWZpYyBldmlkZW5jZSB0byBpbmRpY2F0ZSB0aGF0IGluIGZhY3QgQ08yIGVtaXNzaW9ucyB0cmFwIGhlYXQgYW5kIGxlYWQgdG8gaW5jcmVhc2VkIGdsb2JhbCB0ZW1wZXJhdHVyZXMsIGl0IGlzIGltcG9ydGFudCB0byByZWFsaXplIHRoYXQgdGhlcmUgYXJlIG90aGVyIGZhY3RvcnMgaW52b2x2ZWQgaW4gdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIFVTIENPMiBlbWlzc2lvbnMgYW5kIFVTIGFubnVhbCBhdmVyYWdlIHRlbXBlcmF0dXJlcy4gSG93ZXZlciwgaXQgaXMgdml0YWwgdGhhdCB3ZSB3b3JrIGFyb3VuZCB0aGUgZ2xvYmUgdG8gcmVkdWNlIGdyZWVuaG91c2UgZ2FzIGVtaXNzaW9ucyB0byBtZWRpdGlnYXRlIHRoZSBpbmNyZWFzZWQgdGVtcGVyYXR1cmVzIHRoYXQgd2Ugd2lsbCBleHBlcmllbmNlIGR1ZSB0byB0aGUgZXhpc3RpbmcgQ08yIGFscmVhZHkgaW4gdGhlIGF0bW9zcGhlcmUgc28gdGhhdCB0aGUgd2FybWluZyB0ZW1wZXJhdHVyZXMgYXJlbid0IGFzIGV4dHJlbWUgYXMgdGhleSBjb3VsZCBiZS4gRnVydGhlcm1vcmUsIHdlIG5lZWQgdG8gcHJlcGFyZSBmb3IgaW5jcmVhc2VkIHJhdGVzIG9mIG5hdHVyYWwgZGlzYXN0ZXJzIGFuZCBob3cgdGhlc2UgbWF5IGluZmx1ZW5jZSBwZW9wbGUgYXJvdW5kIHRoZSB3b3JsZC4gRXZpZGVuY2Ugc3VnZ2VzdHMgdGhhdCBpbXBvdmVyaXNoZWQgcGVvcGxlIGFyZSB0aGUgW21vc3QgYWZmZWN0ZWQgYnkgZGlhc3RlcnNdKGh0dHBzOi8vb3Vyd29ybGRpbmRhdGEub3JnL25hdHVyYWwtZGlzYXN0ZXJzKXt0YXJnZXQ9Il9ibGFuayJ9LiBXZSBuZWVkIHRvIGJlIHBhcnRpY3VsYXJseSBtaW5kZWZ1bCBvZiB0aGlzIGFzIHdlIHByZXBhcmUuICAKCiMjICoqSGVscGZ1bCBMaW5rcyoqCgoKY29uZmlkZW5jZSBpbnRldmFscyBsaW5lYXIgcmVnLgpodHRwczovL3JzdHVkaW8tcHVicy1zdGF0aWMuczMuYW1hem9uYXdzLmNvbS8xOTU0MDFfMjBiMzI3MmE4YmIwNDYxNWFlN2VlNGM4MWQxOGZmYjUuaHRtbAo=